watir-webdriver等待IE9的方法

时间:2011-11-18 13:36:00

标签: internet-explorer internet-explorer-9 watir watir-webdriver

我正在尝试使用watir-webdriver和IE9获取我的代码(使用Watir for IE8开发)。 目前我遇到了等待的问题。

例如

Watir::Wait.until{browser.button(:value, "Login").exists?}

它不等待并给我下一个错误

C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/response.rb:50:in `assert_ok': Unable to find element with xpath == .//button[
text()='Login'] | .//input[@value='Login' and (@type='button' or @type='reset' or @type='submit' or @type='image')] (Selenium::WebDriver::Error::UnexpectedJavascriptError
)
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:58:in `new'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:58:in `create_response'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/default.rb:64:in `request'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:39:in `call'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:450:in `raw_execute'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:428:in `execute'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:396:in `find_element_by'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/common/search_context.rb:41:in `find_element'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/locators/element_locator.rb:86:in `find_first_by_multiple'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/locators/element_locator.rb:33:in `locate'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/button.rb:53:in `locate'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/element.rb:259:in `assert_exists'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/element.rb:36:in `exists?'
        from 1.rb:20:in `block in <main>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/common/wait.rb:36:in `until'
        from 1.rb:20:in `<main>'

用IE8尝试过相同的脚本,并遇到同样的问题。 当然我可以用睡眠来解决它,但这不是一个好主意。 如果我在等待前睡了几秒钟,它就能正常工作。

2 个答案:

答案 0 :(得分:1)

试试这个:

browser.button(:value, "Login").wait_until_present

更多信息:http://rubydoc.info/github/jarib/watir-webdriver/master/Watir/Element#wait_until_present-instance_method

答案 1 :(得分:0)

如果由于您的测试服务器使用“无效”(自签名)证书而在认证错误页面后立即发生这种情况,那么您有两种选择。

1)将测试服务器中的证书添加到客户端测试系统上受信任的根证书颁发机构池中。这使得IE将这些证书视为来自可信赖的提供商。 (绝对不要为网站上的网站执行此操作,仅适用于您或公司控制的某个测试服务器)

2)在那里硬睡觉。

问题正在发生,因为IE9在该阻止的证书页面上做了一些特殊的事情 javascript并阻止webdriver访问页面上的任何内容。即使像'browser.text'这样的简单基本方法也会在该页面上失败,更不用说检查现有的元素了。首次检查登录按钮时,仍会显示无效的证书警告页面,这就是导致错误的原因。如果页面从未显示过,或者您只是等待一小段时间,那么您将看不到该错误。

MS在该页面上执行的操作旨在防止恶意软件网站自动执行将您带入其网站的响应。好东西安全明智,但它也阻止Webdriver访问页面。我怀疑网络驱动程序的人会找到一种方法,如果他们这样做,我希望MS能够在不久之后关闭他们认为的“安全漏洞”。

为了进行测试,我确信最佳做法是将测试服务器上的自签名证书添加到测试客户端系统上受信任的根提供程序列表中。这消除了警告,而且比在所有自动化中处理它更快更容易。当它们访问真正的生产服务器时,它还会复制用户体验,毫无疑问它具有有效的证书并且从不产生该警告。

我曾经致力于寻找“脚本化”这些东西的方法,但意识到我只是顽固,应该采取更容易更实际的道路。