2016-03-01 121 views
0

我正在写一个使用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方法很多,也很复杂,其中一些是数百行。

如果有人对此有任何建议,我们将非常感谢,因为这个问题阻碍了我们项目的进一步进展。

谢谢!

+0

在一个单独的线程运行JS在过去一直为我工作。不知道红宝石,但也许这样的:http://www.tutorialspoint.com/ruby/ruby_multithreading.htm –

+0

感谢: Thread.new { button.press } 已经允许控制回传给Webdriver。 但是,我通常的访问警报的方式在这种情况下不起作用: @ IE.switch_to.alert 它似乎没有认识到警报存在。 – Mundisoft

+0

不幸的是,在JavaScript执行时,webdriver被单方面阻止,所以一旦调用webdriver方法(恰好是处理警报的代码片段),脚本就无法进展。 (即使它在单独的线程中运行)。 – Mundisoft

回答

1

如果您知道触发该警报的函数,那么您可以尝试使用JavaScript执行程序。类似下面

((JavascriptExecutor)driver).executeScript("window.alert = function(msg){return true;};"); 

谢谢你, 穆拉利

+0

感谢您的建议,但这并不理想。在我的测试中有很多这样的情况,我正在寻找一种可以在每个这种情况下调用的通用解决方案。 – Mundisoft