【问题标题】:use browser as GUI in Ruby在 Ruby 中使用浏览器作为 GUI
【发布时间】:2012-08-03 00:57:51
【问题描述】:

在 vbscript 中,通常将浏览器 (IE) 用作 GUI。 请参阅下面的示例,它会询问名称并将其返回给脚本。在 Ruby 中,您有一些 GUI,例如 Tcl 和 Shoes,但我想知道如何在浏览器中执行此操作。最简单的 Ruby 解决方案是什么?所以没有额外的 gem 或包,没有已经在运行的服务器。如果需要 gem,最好是可以在 Windows 中正常运行的。

这里是 vbscript 示例

Set web = CreateObject("InternetExplorer.Application")
If web Is Nothing Then
  msgbox("Error while loading Internet Explorer")
  Wscript.Quit
Else
  with web
    .Width = 300
    .Height = 175
    .Offline = True
    .AddressBar = False
    .MenuBar = False
    .StatusBar = False
    .Silent = True
    .ToolBar = False
    .Navigate "about:blank"
    .Visible = True
  end with
End If

'Wait for the browser to navigate to nowhere
Do While web.Busy
  Wscript.Sleep 100
Loop

'Wait for a good reference to the browser document
Set doc = Nothing
Do Until Not doc Is Nothing
  Wscript.Sleep 100
  Set doc = web.Document
Loop

'Write the HTML form
doc.Write "Give me a name<br><form><input type=text name=name ><input type=button name=submit id=submit value='OK' onclick='javascript:submit.value=""Done""'></form>"
Set oDoc = web.Document
Do Until oDoc.Forms(0).elements("submit").Value <> "OK"
  Wscript.Sleep 100
  If web Is Nothing or Err.Number <> 0 Then
    msgbox "Window closed"
    Wscript.Quit
  End If
Loop
name = oDoc.Forms(0).elements("name").value
oDoc.close
set oDoc = nothing
web.quit
set web = nothing
Wscript.echo "Hello " & name

【问题讨论】:

    标签: ruby internet-explorer user-interface vbscript


    【解决方案1】:

    您可以使用 Watir 宝石。 gem 最初旨在驱动 IE 浏览器,但会满足您的需要。

    查看:

    1) 安装 Watir gem

    2) 使用以下内容创建一个 test.htm 文件:

    Give me a name<br>
    <form name="myForm" title="myForm">
        <input type="text" id="name" >
        <input id="submit" type="button" value="OK" onclick='document.myForm.submit.value="Done"'>
    </form>
    

    3) 运行以下 watir 脚本,它将打开浏览器到您的表单。输入名称后点击【确定】,即可输出名称。请注意,您可能需要根据保存 test.htm 的位置更改脚本中文件的位置:

    require 'watir'
    
    b = Watir::IE.new
    begin
        b.goto('file:///C:/Documents%20and%20Settings/Setup/Desktop/test.htm')
        begin
            sleep(5)
        end until b.button(:id, 'submit').value != "OK"
        name = b.text_field.value
    ensure
        b.close
    end
    puts name
    

    我认为这表明了做你想做的事情的一般可行性。表单的验证和动态创建也是可能的。

    【讨论】:

      【解决方案2】:

      在 Ruby 中,人们通常使用 Rails、Sinatra 或 Camping 之类的东西来制作 Web 应用程序。这些都需要宝石。如果您想要更类似于您的 VBscript 示例的东西,而不必使用 gems,您可能可以使用 Win32OLE(虽然我还没有尝试过打开它并与 IE 交互)。

      【讨论】:

      • 不了解 Camping,但 Rails 是一个完整的框架,对于我所要求的内容而言,它太过分了。 Sinatra 更好(我使用它)但实际上是一种服务器,我搜索可以在同一个脚本中启动和解释的东西。我考虑过 Win32OLE(我也经常使用它),但肯定有更好、更像 Ruby 的东西吗?
      【解决方案3】:

      win32olealready mentioned

      这里是一个示例脚本:

      require 'win32ole' 
      def inputbox( message, title="Message from #{__FILE__}" )
        # returns nil if 'cancel' is clicked
        # returns a (possibly empty) string otherwise
        # hammer the arguments to vb-script style
        vb_msg = %Q| "#{message.gsub("\n",'"& vbcrlf &"')}"|
        vb_msg.gsub!( "\t", '"& vbtab &"' )
        vb_msg.gsub!( '&""&','&' )
        vb_title = %Q|"#{title}"|
        # go!
        sc = WIN32OLE.new( "ScriptControl" )
        sc.language = "VBScript"
        sc.eval(%Q|Inputbox(#{vb_msg}, #{vb_title})|)
        #~ sc.eval(%Q|Inputbox(#{vb_msg}, #{vb_title}, aa,hide)|)
      end
      
      #simple use
      res = inputbox "Your input please." 
      p res
      

      要给出一个消息框,您可以使用:

      require 'win32ole'
      def popup(message)
        wsh = WIN32OLE.new('WScript.Shell')
        wsh.popup(message, 0, __FILE__)
      end
      

      http://rubyonwindows.blogspot.com/2007/04/ruby-excel-inputbox-hack.html(此示例的来源)中,您还可以找到使用 Excel 的解决方案。

      【讨论】:

      • 在 echristopherson 上查看我的评论,我会尝试您的脚本并随时通知您,但我更喜欢其他解决方案
      • 我明白了,您在这里以一种有趣的方式使用了罕见的 vbscript 对话框,为此 +1 但它们在很大程度上是不够的,因此在 vbscript 中使用浏览器作为 GUI,我会看看也在现场,谢谢
      • @peter 老实说,我不使用 vbscript 对话框。到目前为止,我使用 shell(命令提示符),通常与 rake 结合使用。但是我在过去标记了博客条目,我认为它可以回答您的问题。
      【解决方案4】:

      好吧,我相信最简单的 Windows 图形用户界面是简陋的命令提示符。不需要 gems,据我从上面的 VBscript 代码中可以看出,不需要打开浏览器或将内容保存到 excel 或文本文件。所以用你的简约规格;)你在这里..:

          puts "Give me a name" #output to cmd
          $name=gets.chomp #get a name from user 
      
          puts "Hello there..: #{$name}"
      

      上面的程序将使用 windows cmd 作为 GUI,并从用户那里获取输入并将其输出到屏幕上。然后,如果您想使用带有按钮和东西的表单,请创建一个包含几个表单的简单网站并按以下方式加载它(需要一个 gem --> 'selenium-webdriver')

      require "selenium-webdriver"        #selenium lib
      driver = Selenium::WebDriver.for :firefox
      
      !30.times { if (driver.navigate.to("http://www.google.com") rescue false) then break else sleep 1; end }  #loop that will try 30times (once every sec to access the google.com)
      

      如果您需要更多关于如何从/向文件传递/读取值的信息,请告诉我。祝你好运!

      【讨论】:

      • GUI 是图形用户界面,您建议的是简单的控制台文本界面,但我会尝试使用 selenium 解决方案,谢谢
      • 脚本失败,我有一个使用 selenium 的脚本,但现在也失败了,Firefox 14.0.1 的版本问题?C:/Ruby193/lib/ruby/gems/1.9.1/gems /selenium-webdriver-2.20.0/lib/selenium/webdriver/firefox/launcher.rb:77:in `connect_until_stable': 无法在 60 秒内获得稳定的 firefox 连接 (127.0.0.1:7055) (Selenium::WebDriver: :Error::WebDriverError) 但是你将如何传递和获取值?
      • 你说的是最简单的,没有宝石;)关于脚本失败,看看这个[链接](stackoverflow.com/questions/7263564/…)。但是它可能是 Firefox 的版本,如果上述方法不起作用,请尝试切换到较低版本。如果您说的是自动化,我不确定您所说的“您如何传递和获取值”是什么意思,您可以使用 excel 文件并在那里获取/写入数据..
      • 顺利通过并获取您想要显示的内容(文本、复选框、选择列表等)并获得响应。在工作中尝试过,发现 IE 不受 selenium 支持,FF en Chrome 被阻止,所以 Selenium 恐怕对我来说不可行
      猜你喜欢
      • 2012-11-02
      • 2016-09-26
      • 1970-01-01
      • 2011-01-09
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多