我正在寫一個使用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