我正在尝试将Ruby + WATIR安装到处于隔离环境中的Windows服务器上.通常我会运行ruby安装程序,然后执行以下两个命令:
1)gem update --system
2)gem install watir
这是根据这里的指示
我现在尝试安装的服务器没有互联网连接.这会导致上面的命令失败.
有没有办法可以下载所需的更新包并将它们复制到服务器以在本地安装?
我正在使用watir-webdriver并试图检查HTML元素的背景颜色.问题是背景颜色是在CSS中设置的,而不是在HTML标记内.
有没有办法使用watir-webdriver读取CSS值?
我正在将一些遗留的Watir脚本迁移到Watir-Webdriver.除了他们如何设计Watir-Webdriver来处理弹出窗口之外,迁移已经很顺利.他们不是使用经过验证的"附加"方法,而是使用简化的"窗口"方法替换它.语法非常简单,但是我很难理解如何在不关闭父窗口的情况下关闭单独的子窗口.目前我的代码是这样的 -
b.button(:xpath => PREVIEWBUTTON).click
b.window(:title, POPUPWINDOW).use DO
b.close
end
Run Code Online (Sandbox Code Playgroud)
目前发生的事情是b.close方法正在关闭子窗口和父窗口.我不确定为什么会发生这种情况,因为b.close方法包含在DO块中.我需要验证'PREVIEWBUTTON'确实创建了一个子窗口,但我需要父窗口保持打开状态.
如何使用watir-webdrive刷新页面?我尝试了他们在这里说的话:http://watirwebdriver.com/sending-special-keys/,但没有运气.
browser.send_keys :f5
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?谢谢
这是一个研究案例:
<html>
...
<embed name="foo">
<embed name="bar">
...
</html>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Watir Ruby的API引用名为"bar"的embed元素.该元素由Chrome的DOM Inspector显示,但我无法使用Watir的任何查找方法找到它:
browser.embeds() # only <embed name="foo"> is found
browser.html.include? 'bar' # => false
Run Code Online (Sandbox Code Playgroud)
为什么会这样?为什么Watir没有显示完整的HTML?如果我有不同帧中的元素或由Javascript init函数动态插入,是否可以使用Watir访问它们?
谢谢
我是Ruby和Watir-Webdriver的新手.我有一套用VBScript编写的自动化网站,我想将它转换为Ruby/Watir,因为我现在必须支持Firefox.我发现我真的很喜欢Ruby,而且我正在研究Watir,但我花了一周的时间试图让Webdriver甚至显示我的登录屏幕.
该网站以"我同意"区域的"警告屏幕"开头.用户点击我同意并出现登录屏幕.
<body onload="showMessage('true')"><div id="login"><div id="message"><map name="accept">
<area href="javascript:showLogin();" shape="rect" coords="280,390,384,432" />
</map></div></div></body>
Run Code Online (Sandbox Code Playgroud)
我需要点击该区域来显示登录屏幕(这是同一页面,一个表格真的,只是隐藏).我用VBScript整天做这个:
objExplorer.Document.GetElementsByTagName("area")(0).click
Run Code Online (Sandbox Code Playgroud)
但是,使用Watir-Webdriver,browser.area(:index,0).click什么都不做.
puts browser.area(:index, 0).shape
=>RECT
puts browser.area(:index, 0).coords
=>280,390,384,432
Run Code Online (Sandbox Code Playgroud)
所以,我知道脚本可以"看到"区域元素并读取其属性.它对click事件没有任何作用.
如果我在href本身使用browser.goto:
browser.goto("javascript:showLogin();")
Run Code Online (Sandbox Code Playgroud)
登录变得可见,但我无法与元素交互(设置用户名和密码的文本字段).我正在查看打开开发人员工具窗口的页面(查看HTML),它只是说"正在加载...".
这是我被困的地方.有趣的是,如果我使用登录表单的名称并执行以下操作:
browser.form(:name, "LoginForm").submit
Run Code Online (Sandbox Code Playgroud)
我从用户名和密码为空的表单中获取弹出消息,因此仍然存在一些交互.
当然,如果我手动输入用户名/密码,即使表示"正在加载......",我也可以提交表格.
我理解"when_present.click"和等待浏览器的其他技术; 这些都行不通.我的困境是我无法点击该区域,如果我在javascript上使用goto,则浏览器会忽略Watir的自动化.
谢谢你的帮助.即使回答"抱歉,Watir或Webdriver不会这样做"也是我可以接受的.它将允许我继续前进并寻找其他解决方案.
在评论中的问题后编辑:
对不起,该网站不公开,所以我无法发布链接.至于在Firefox中工作,脚本工作得很好.IE正在解决这个问题.这些评论让我想到:我第一次导航到网站时,确实得到了"......不是由可信任的证书......"证书错误.我在IE中获得的证书错误是否会在呈现表单之前导致与自动化的某种断开?我使用stackoverflow上的一行来点击证书错误:
browser.goto("javascript:document.getElementById('overridelink').click()")
Run Code Online (Sandbox Code Playgroud)
但现在我想也许这可能是问题的一部分.我已经转到我的IE(使用IE 9)选项并取消选中用于检查证书的安全选项,但无济于事.如果这可能导致问题,我将不得不与基础架构团队协商生成证书,以便我们在每次构建新服务器时下载.
我编写了几个类来管理我想要处理几个网站的方法,两者都有类似的方法(即登录,刷新).每个类都会打开自己的WATIR浏览器实例.
class Site1
def initialize
@ie = Watir::Browser.new
end
def login
@ie.goto "www.blah.com"
end
end
Run Code Online (Sandbox Code Playgroud)
main中没有线程的代码示例如下
require 'watir'
require_relative 'site1'
agents = []
agents << Site1.new
agents.each{ |agent|
agent.login
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但没有移动到下一个代理,直到当前的一个完成登录.我想结合多线程来处理这个,但似乎无法让它工作.
require 'watir'
require_relative 'site1'
agents = []; threads = []
agents << Site1.new
agents.each{ |agent|
threads << Thread.new(agent){ agent.login }
}
threads.each { |t| t.join }
Run Code Online (Sandbox Code Playgroud)
这给了我错误:未知的属性或方法:navigate
.HRESULT错误代码:0x8001010e.该应用程序调用了一个为不同线程编组的接口.
有谁知道如何解决这个问题,或者如何实现类似的功能?
我已经创建了一个Watir::Browser
chrome设置为浏览器的实例.
b = Watir::Browser.new :chrome
Run Code Online (Sandbox Code Playgroud)
如果我手动关闭警报,然后尝试使用刷新页面
b.refresh
Run Code Online (Sandbox Code Playgroud)
抛出以下错误:
Selenium::WebDriver::Error::UnhandledAlertError: unexpected alert open
(Session info: chrome=28.0.1500.95)
(Driver info: chromedriver=2.2,platform=Windows NT 6.1 x86_64)
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/response.rb:51:in assert_ok'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/response.rb:15:in initialize'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/http/common.rb:59:in new'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/http/common.rb:59:in create_response'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/http/default.rb:66:in request'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/http/common.rb:40:in call'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/bridge.rb:634:in raw_execute'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/bridge.rb:612:in execute'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/remote/bridge.rb:210:in refresh'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.35.0/lib/selenium/webdriver/common/navigation.rb:38:in refresh'
from C:/ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.4/lib/watir-webdriver/browser.rb:201:in refresh'
Run Code Online (Sandbox Code Playgroud)
当我打电话给b.alert.exists?
它返回true
.
我尝试使用b.alert.initialize
重置警报的状态,但它抛出异常.
有没有办法完全重置浏览器对象的状态?
我试图用Ruby中的Selenium WebDriver 2.4模拟鼠标移动
如果我运行测试,我是否应该看到鼠标在屏幕上移动?我糊涂了.
我尝试了很多不同的方法示例代码:
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.navigate.to 'http://www.google.com'
element = driver.find_element(:id, 'gbqfba')
Run Code Online (Sandbox Code Playgroud)
然后我试过了
driver.action.move_to(element).perform
driver.mouse.move_to(element)
Run Code Online (Sandbox Code Playgroud)
还有Watir的悬停方法.
到目前为止我找到的最好的方法是Watir的fire_event'onmouseover'但仍然没有移动鼠标:)
在SO和其他地方搜索之后,我似乎无法在WebDriver中移动鼠标.
什么事情发生?是否可以在屏幕上实际移动鼠标光标(当webdriver浏览器窗口在视图中时)
我目前正在尝试编写一个迭代输入文件并检查网站数据的脚本.如果找到新数据,它会打印到它传递的终端,如果没有,它会告诉我它失败了.对于删除的数据,反之亦然.它一直工作正常,直到我给出的输入文件包含"™"字符.然后当ruby到达那一行时,它会吐出一个错误:
PDAPWeb.rb:73:在`include?'中:不兼容的字符编码:UTF-8和IBM437(Encoding :: CompatibilityError)
违规行是一个简单的检查,以查看页面上是否存在文本.
if browser.text.include? (program_name)
Run Code Online (Sandbox Code Playgroud)
其中program_name变量是来自输入文件的已解析信息.在这种情况下,program_name包含前面提到的'TM'字符.
经过一些研究后,我发现在我的脚本开头添加#encoding:utf-8行可能有所帮助,但到目前为止还没有证明有用.
我将它添加到我的program_name变量中以查看它是否有用(并且它允许我的脚本无错误地运行),但现在它没有正确地找到它应该的TM字符.
program_name = record[2].gsub("\n", '').force_encoding("utf-8").encode("IBM437", replace: nil)
Run Code Online (Sandbox Code Playgroud)
这似乎将TM字符转换为:Γäó
我想也许我有IBM437和utf-8部件相反,所以我尝试了相反的
program_name = record[2].gsub("\n", '').force_encoding("IBM437").encode("utf-8", replace: nil)
Run Code Online (Sandbox Code Playgroud)
并且我现在在尝试运行脚本时收到此错误
PDAPWeb.rb:48:在`encode'中:从UTF-8到IBM437的U + 2122(Encoding :: UndefinedConve rsionError)
我使用的是ruby 1.9.3p392(2013-02-22),我不确定是否应该升级,因为这是我公司安装的标准版本.
我的编码是否不正确并导致它转换TM字符有错误?