我正在使用Selenium在Ruby上编写Web应用程序的测试,但我遇到了一些麻烦。
在我的自动化测试中,selenium webdriver点击一个元素,然后执行一些Javascript。
Javascript会创建一个警报窗口,我通常会接受:
@IE.switch_to.alert.accept
但是,在这种情况下,控制权不会传回Webdriver,我无法接受警报。
似乎Javascript仍在执行 - 可能只是等待接受警报。
但是因为webdriver要求javascript完成执行才能接受警报,因此无法接受警报并且javascript永远不会完成执行。
我无权修改Javascript,因此修复必须在selenium端。
有没有办法可以在不强制webdriver等待的情况下执行Javascript?
----更新1 -----
作为一名评论者建议在单独的线程中运行javascript使我能够重新获得对webdriver的控制:************错误 - 请参阅更新2 ******** ***********
Thread.new{
button.press
}
不幸的是,我无法像往常一样处理警报:
@IE.switch_to.alert
^无效
----更新2 -----
即使在线程中运行,javascript的执行仍会阻止webdriver进一步执行。
我正在使用Selenium Grid远程执行测试。
正因为如此,我无法向远程PC发送击键或任何类型的信号,除非远程webdriver提供了该方法,并且由于Jdriver执行阻止了webdriver(即使它正在运行单独的线程)一旦发出警报,我就无法与远程PC通信。
我对解决方案的最接近的想法就像Murali在下面建议的那样,并且用不返回警报的方法覆盖javascript方法。然而,这远非理想,我将重写的javascript方法是众多而复杂的,其中一些是数百行长。
如果有人对此事有任何建议,我们将非常感激,因为这个问题阻碍了我们项目的任何进一步进展。
谢谢!
答案 0 :(得分:1)
如果您知道触发该警报的功能,那么您可以尝试使用javascript执行程序。类似下面的内容
((JavascriptExecutor)driver).executeScript("window.alert = function(msg){return true;};");
谢谢你, 穆拉利