簡介
Selenium 是一個(gè)健壯的工具集合,跨很多平臺支持針對基于 web 的應(yīng)用程序的測試自動(dòng)化的敏捷開發(fā)。它是一個(gè)開源的、輕量級的自動(dòng)化工具,很容易集成到各種項(xiàng)目中,支持多種編程語言,比如 .NET、Perl、Python、Ruby 和 Java? 編程語言。
利用 Selenium 測試 Ajax 應(yīng)用程序
Asynchronous JavaScript and XML (Ajax) 是一種用于創(chuàng)建交互式 web 應(yīng)用程序的 web 開發(fā)技術(shù)。Ajax 應(yīng)用程序的一個(gè)特征是,不會導(dǎo)致一次重新加載整個(gè)頁面。相反,瀏覽器將具有一個(gè)對服務(wù)器的異步調(diào)用以獲得數(shù)據(jù),并且只刷新當(dāng)前頁面的特定部分。要提高 web 頁面的交互性、響應(yīng)速度和可用性,測試 Ajax 應(yīng)用程序的過程需要一些改變。
我們首先刷新 web 頁面,然后是等待,直到異步調(diào)用完成。完成之后,可以繼續(xù)進(jìn)行驗(yàn)證。此時(shí),出現(xiàn)適當(dāng)?shù)却龝r(shí)間的問題。
一種選擇是在測試應(yīng)用程序中簡單地暫停一段固定的時(shí)間,這在大多數(shù)情況下都是可行的。在有些情況下,比如說網(wǎng)絡(luò)吞吐量很慢時(shí),Ajax 調(diào)用在暫停一段特定的時(shí)間之后沒有完成,會導(dǎo)致測試用例失敗。另一方面,如果暫停時(shí)間太長,會使得測試慢得不可接受。
Selenium 提供了更為高效的處理等待的方式。一種可能做法是,使用類 com.thoughtworks.selenium.Wait 來等待一個(gè)元素或文本在頁面上出現(xiàn)或消失。可以在 until() 函數(shù)中定義等待的退出條件,或者擴(kuò)展 Wait 類來實(shí)現(xiàn)等待退出。清單 1 是使用 Wait 類的樣例代碼。它將在條件滿足時(shí)停止等待,或者在超出大等待時(shí)間時(shí)返回一個(gè)超時(shí)異常。
清單 1. 等待元素或文本出現(xiàn)
Wait wait = new Wait() {
public boolean until() {
return selenium.isElementPresent(locator);
// or selenium.isTextPresent(pattern);
}
};
wait.wait("", timeoutInMilliseconds);
另一種選擇是使用 Selenium 中的 waitForCondition 函數(shù),一個(gè) JavaScript 代碼片段將被作為參數(shù)傳遞給該函數(shù)。一旦 Selenium 檢測到條件返回為真,它將停止等待。您可以等待一些元素或文本出現(xiàn)或者不出現(xiàn)。JavaScript 可以運(yùn)行在由 Selenium.browser.getCurrentWindow() 函數(shù)彈出的應(yīng)用程序窗口中。清單 2 是檢查窗口狀態(tài)的樣例代碼。它只工作在 Firefox 中。
清單 2. 等待窗口緒的狀態(tài)
String script = "var my_window = selenium.browserbot.getCurrentWindow();"
script += "var bool;";
script += "var readyState = (my_window.document.readyState);";
script += "if (readyState == 'complete'){";
script += "bool = 'true';";
script += "}";
script += "bool;";
selenium.waitForCondition(script, timeoutInMilliseconds);
如何支持 dojo 應(yīng)用程序
Dojo 是一個(gè)常用的 JavaScript 工具包,用于構(gòu)造動(dòng)態(tài) web 界面。使用 Selenium 測試 Dojo 應(yīng)用程序時(shí)的一個(gè)關(guān)鍵點(diǎn)是認(rèn)識 Dojo 小部件和記錄它們的操作。作者定義的 Dojo 小部件處于抽象級別。頁面運(yùn)行時(shí),會將 Dojo 小部件轉(zhuǎn)換成基本的 HTML 代碼。存在很多由 Dojo 自動(dòng)生成的 HTML 代碼,因此,Dojo 小部件的認(rèn)識可能與傳統(tǒng) HTML 小部件有些不同。
Dojo 小部件上執(zhí)行的操作(包括文本字段、按鈕復(fù)選框和單選按鈕)可能與 HTML 小部件相同。但是,Dojo 在組合框上提供的日期選擇器和其他額外的小部件可能需要特定的處理。
圖 1. Dojo 組合框
展示帶幾個(gè)選項(xiàng)的組合框的屏幕快照
使用 Selenium IDE 來記錄圖 1 中提供的組合框上選中的操作。單擊向下箭頭,會出現(xiàn)一個(gè)下拉列表。選中第三項(xiàng) Stack(SWG)。記錄的腳本提供在圖 2 中。
圖 2. Selenium IDE 記錄的腳本
展示 Selenium 所記錄信息(比如鼠標(biāo)單擊)的屏幕快照
有時(shí),只會由 IDE 生成第二行腳本。在這種情況下,添加單擊箭頭按鈕的操作。對于上面的腳本,如果第一行被重新播放,那么它應(yīng)該生成下拉列表。但是它不執(zhí)行任何操作。對于多個(gè) Dojo 小部件,單擊并不真正執(zhí)行單擊操作。將 click(locator) 更改為 clickAt(locator, coordString) 或者 MouseDown(locator) 和 MouseUp(locator)。
對于下拉列表,等待時(shí)間應(yīng)該相加。像圖 2 中展示的腳本一樣,選中項(xiàng)的單擊操作將會剛好在單擊向下箭頭按鈕之后執(zhí)行。它可能會因?yàn)橄吕斜頉]有出現(xiàn)而失敗。簡單地添加一個(gè) pause 命令,或者使用 waitFor 命令等待菜單項(xiàng)元素出現(xiàn),并繼續(xù)執(zhí)行下一個(gè)命令。
修改后的將會自動(dòng)化 Dojo 組合框上的選擇的腳本展示在圖 3 中。
圖 3. 修改后的在 Dojo 組合框中進(jìn)行選擇的 IDE 腳本
屏幕快照展示 clickAt、waitForElement 和 ClickAt 命令已修改
RC 代碼展示在清單 3 中。
清單 3. 自動(dòng)化 Dojo 組合框中選擇操作的 RC 代碼
selenium.clickAt("//div[@id='widget_offeringType']/div/div",””);
selenium.waitForCondition("selenium.isElementPresent("offeringType_popup2")", "2000");
selenium.clickAt("offeringType_popup2",””);
圖 4. 日期選擇器
展示日期選擇器的常規(guī)月歷視圖的屏幕快照
對于圖 4 中的日期選擇器例子,執(zhí)行的操作可能不會被 IDE 記錄。編寫如下面清單 4 所示的 RC 代碼。