我正在写一个使用Selenium在Ruby之上的Web应用程序的测试,我遇到了一些麻烦。阻止从执行阻塞硒webdriver的Javascript执行
在我的自动化测试中,selenium webdriver单击一个元素,然后执行一些Javascript。
,JavaScript创建一个警告窗口,我通常会接受:
@IE.switch_to.alert.accept
然而在这种情况,控制不回传给webdriver的,我无法接受的警报。
看起来好像Javascript仍在执行 - 可能只是等待警报被接受。
但是,因为webdriver需要JavaScript来完成执行之前它可以接受警报,警报不能被接受,JavaScript将永远不会执行完成。
我没有修改Javascript的权限,所以修复必须在硒端。
有什么办法可以在不强迫webdriver等待的情况下执行Javascript?
----更新1 -----
作为一个评论者建议运行在一个单独的线程的JavaScript使我重拾与webdriver的控制:********** **错了 - 看到Update 2 *******************
Thread.new{
button.press
}
不幸的是我不能处理警告,因为我通常会:
@IE.switch_to.alert
^不工作
---- UPDATE 2 -----
即使在线程中运行,javascript的执行仍会阻止webdriver进一步执行。
我正在使用Selenium Grid远程执行测试。
因此,我无法向远程PC发送击键或任何类型的信号,除非远程Web驱动程序提供此方法,并且由于JavaScript执行程序阻止了Web驱动程序(即使它正在运行一个单独的线程)一旦引发警报,我无法与远程PC通信。
我对解决方案的最接近的想法就像Murali在下面提出的建议,并覆盖JavaScript方法,不会返回警报。然而,这与理想情况相去甚远,我会重写的javascript方法很多,也很复杂,其中一些是数百行。
如果有人对此有任何建议,我们将非常感谢,因为这个问题阻碍了我们项目的进一步进展。
谢谢!
在一个单独的线程运行JS在过去一直为我工作。不知道红宝石,但也许这样的:http://www.tutorialspoint.com/ruby/ruby_multithreading.htm –
感谢: Thread.new { button.press } 已经允许控制回传给Webdriver。 但是,我通常的访问警报的方式在这种情况下不起作用: @ IE.switch_to.alert 它似乎没有认识到警报存在。 – Mundisoft
不幸的是,在JavaScript执行时,webdriver被单方面阻止,所以一旦调用webdriver方法(恰好是处理警报的代码片段),脚本就无法进展。 (即使它在单独的线程中运行)。 – Mundisoft