2010-08-18 45 views
4

我們的團隊一直在使用Selenium測試我們的應用程序,因爲它主要是JavaScript驅動的,我們一直有偶爾失敗的測試問題。隨着測試次數的增加,至少有一次兩次測試失敗的可能性已經成爲確定性因素。如何使用Selenium測試Ajax應用程序並保持其穩定?

我們最近想到的是,我們可能有一個競爭條件,在初始化JavaScript有機會將事件處理程序附加到被單擊的元素之前,硒將單擊鏈接。當然,在這一點上,我們正在尋找的效果不會發生,我們會得到一個失敗的測試。

目前我們在點擊之前增加了一點點延遲,以使初始化JavaScript代碼的時間結束,這顯然有點冒失,增加了整體測試執行時間,並且不保證測試不會仍然失敗,所以我們正在尋找更好的解決方案。

到目前爲止,我們提出的最好的想法是在點擊事件之前注入一個隱藏的元素到Selenium可以等待的DOM中,以知道它已經準備好。就開發者而言,當我們處理異步事件,刪除和添加元素時,這會帶來額外的額外開銷。此外,它還爲我們的頁面添加了額外的東西,這對應用程序來說並不是必需的

有沒有人有更好的策略?你已經做了什麼來有效地解決這個問題?

回答

2

我的確和你一樣:添加一些延遲,並等待一些元素出現在頁面上。我對它完全沒問題。也許切換到Webdriver/selenium 2.0會有所幫助。如果使用內存數據庫或在測試之間共享相同的硒/硒服務器,或者甚至使用並行化(例如使用TestNG輕鬆實現),則可以削減測試執行。

+0

當然,還有優秀的Selenium Grid可以在多臺機器上同時運行大量測試。 – 2010-08-18 21:07:05

+0

這就是我們最終做的。有意在稍後解決它。它大部分是穩定的,但少數測試偶爾也會遇到問題。我想這只是一場持續的戰鬥。 – William 2011-01-03 02:17:48

3

我們搬到硒2(webdriver的),並且使用Page Objects pattern與PageFactory/AjaxElementLocatorFactory - 這樣的一個例子是here

+1

Thx,現在你讓我想重寫所有的Selenium測試以使用頁面對象模式:) – 2011-02-15 07:26:50

1

您是否嘗試過的waitForElementPresent命令,然後使其點擊?

1

要消除競爭條件,請使用Selenium的runScript(String initCondition)waitForCondition(String jsConditional, String timeout)方法。例如,如果您要測試的AJAX功能導致將新元素添加到dom中,則可以使用類似以下內容的東西。

String jsPoll = ""; 
jsPoll += "selenium.browserbot.getCurrentWindow()"; 
jsPoll += ".document.getElementById('DOMID')"; 
selenium.waitForCondition(jsPoll, "30000"); 

當元素被添加並且方法將繼續時,條件將評估爲真。如果您的AJAX函數交換元素(即:一個div用於另一個類似標識的div),則可以使用類似以下內容的初始化條件。

String jsInit = ""; 
jsInit += "!selenium.browserbot.getCurrentWindow()"; 
jsInit += ".document.getElementById('DOMID').setAttribute('SELENIUMTEST','1')"; 
String jsPoll = ""; 
selenium.runScript(jsInit); 
jsPoll += "selenium.browserbot.getCurrentWindow()"; 
jsPoll += ".document.getElementById('DOMID').getAttribute('SELENIUMTEST') != 1"; 
selenium.waitForCondition(jsPoll, "30000"); 

當元素被AJAX函數換出時,條件的計算結果爲true。

1

恕我直言延遲不是一個好的解決方案(只是一種解決方法)。

我們使用iMacros的圖像識別功能來測試棘手的AJAX(和Flash)。對於硒,也許你可以將它與AutoHotKey(其中包含基本圖像搜索,並作爲桌面應用程序測試工具流行)? http://www.autohotkey.com/docs/commands/ImageSearch.htm

相關問題