2016-03-01 112 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