watir-webdriver IE9 等待方法
我正在尝试让我的代码(使用 Watir 为 IE8 开发)与 watir-webdriver 和 IE9 一起使用。 目前我有等待的问题。
例如,
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 相同的脚本,并且有相同的问题。 当然,我可以通过睡眠来解决这个问题,但这不是一个好主意。 如果我在等待之前睡几秒钟,效果就很好。
I'm trying to get my code(developed with Watir for IE8) working with watir-webdriver and IE9.
Currently I have an issue with waiting.
For example
Watir::Wait.until{browser.button(:value, "Login").exists?}
It doesn't wait and gives me next error
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>'
Tried same script with IE8, and have the same issue.
Of course I can workaround it with sleep, but it's not very good idea.
If I do sleep for few seconds before wait, it works fine.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个:
更多信息: http://rubydoc.info /github/jarib/watir-webdriver/master/Watir/Element#wait_until_present-instance_method
Try this:
More info: http://rubydoc.info/github/jarib/watir-webdriver/master/Watir/Element#wait_until_present-instance_method
如果由于您的测试服务器使用“无效”(自签名)证书而在认证错误页面后立即发生这种情况,那么您有两种选择。
1) 将测试服务器中的证书添加到客户端测试系统上的受信任根证书颁发机构池中。这使得 IE 将这些证书视为来自受信任的提供商。 (切勿对网络上的站点执行此操作,仅对您或公司中的某人控制的测试服务器执行此操作)
2)硬连线在那里睡眠。
问题的发生是因为 IE9 在该证书页面上做了一些特殊的事情来阻止
javascript 并阻止 webdriver 访问页面上的几乎所有内容。即使像“browser.text”这样简单的基本方法也会在该页面上失败,更不用说检查是否存在元素了。对登录按钮的第一次检查是在仍然显示无效证书警告页面的情况下进行的,这就是导致错误的原因。如果该页面从未显示,或者您只等待了一小会儿,那么您将不会看到该错误。
MS 在该页面上所做的事情旨在防止恶意软件网站自动做出响应,将您带到他们的网站。安全方面的好东西,但它也阻止了 Webdriver 访问该页面。我怀疑网络驱动程序的人们会找到解决这个问题的方法,如果他们找到了解决办法,我希望微软会在不久之后关闭他们认为的“安全漏洞”。
对于测试,我确信最佳实践是将自签名证书从测试台服务器添加到测试客户端系统上的受信任根提供程序列表中。这消除了警告,而且比在所有自动化中处理它更快、更容易。它还会复制用户访问真正的生产服务器时的体验,该服务器无疑具有有效的证书并且永远不会产生该警告。
我曾经致力于寻找“围绕这些东西编写脚本”的方法,但意识到我只是很固执,应该采取更简单、更实际的路径。
If this is happening immediately after a certification error page due to your test server using an 'invalid' (self signed) cert then you have two options.
1) Add the cert(s) from your test server(s) to your the pool of trusted root cert authorities on your client test system(s). This makes IE treat those certs as if they came from a trusted provider. (never do this for a site on the net, only for test servers you or someone in your company controls)
2) hardwire a sleep in there.
The problem is happening because IE9 does some special stuff on that cert page that blocks
javascript and prevents webdriver from accessing pretty much anything on the page. Even simple basic methods like 'browser.text' will fail on that page, much less checking for an element existing. The first check for the login button is happening while the invalid cert warning page is still displayed, and that's what causes the error. If the page is never displayed, or you wait just a tiny bit of time, then you won't see that error.
What MS is doing on that page is designed to prevent a malware site from automating a response that would take you forward into their site. Good stuff security wise, but it is also blocking Webdriver from accessing the page. I doubt the webdriver folks will find a way past this, and if they do I'd expect MS to close down what they would view as a 'security hole' shortly afterwards.
For testing I'm convinced that the best practice is just to add self-signed certs from testbed servers to your trusted root providers list on your test client systems. That eliminates the warnings and furthermore is faster and easier than dealing with it in all of your automation. It also duplicates the user experience when they hit your genuine production server which no doubt has a valid certificate and never produces that warning.
I used to be dedicated to finding ways of 'scripting around' that stuff, but realized I was just being stubborn and should take the easier more practical path.