這個HTML錨標記定義了一個ID屬性為“adminHomeForm”按鈕。和大部分HTML標簽相比,這是一個相當復雜的錨標記,但它仍然是一個靜態(tài)標簽。每次頁面被瀏覽器加載時,HTML將保持不變。它的ID在所有的頁面實例里保持不變,也是說,頁面被展示時,這個UI元素總是有同樣的標識符。所以,點擊此按鈕的測試腳本(Selenium Server)如下所示:
selenium.click("adminHomeForm");
然而,你的應用程序,可能生成動態(tài)的HTML標識符。在不同的網(wǎng)頁實例中,標識符發(fā)生改變。例如,一個動態(tài)的頁面的HTML元素可能會是這個樣子:
<input id="addForm:_ID74:_ID75:0:_ID79:0:checkBox" type="checkbox" name="addForm:_ID74:_ID75:0:_ID79:0:checkBox" value="true" />
這是一個復選框,id和name屬性都是addForm:_ID74:_ID75:0:_ID79:0:checkBox。在這種情況下,使用標準的定位,測試腳本應該是這樣子的:
selenium.click("addForm:_ID74:_ID75:0:_ID79:0:checkBox");
對于動態(tài)生成的標識符,這種做法行不通。下一次頁面加載時,標識符將是一個不同的值,執(zhí)行上述腳本會遇到“element not found”錯誤。
要更正該問題,一個簡單的解決辦法是使用XPath定位替代ID定位器。因此,對于該復選框,可以簡單地使用
selenium.click("//input");
或者,如果它不是在頁面上的第一個文本輸入域,嘗試一個更詳細的XPath語句。
selenium.click("//input[3]");
或
selenium.click("//div/p[2]/input[3]");
但是,如果你確實需要使用ID來定位元素,可以換一種不同的解決方案。您可以先捕捉到網(wǎng)站的這個ID,然后再使用它,例如:
String[] checkboxids = selenium.getAllFields(); // Collect all input IDs on page.
for(String checkboxid:checkboxids) {
if(checkboxid.contains("addForm")) {
selenium.click(expectedText);
}
}
如果頁面上只有一個復選框的ID文本為“expectedText”時,這種方法工作。
● 定位Ajax元素
定位、驗證AJAX元素的好的方式是使用Selenium 2.0 webdriver的API,它專門解決Selenium 1.0測試AJAX元素的一些限制。
在Selenim 2.0中,可以使用waitfor()方法來等待一個頁面元素變得可用。該參數(shù)是一個WebDriver用來實現(xiàn)定位的By對象。這是WebDriver的章節(jié)中詳細解釋。
在Selenium 1.0(Selenium-RC的)中,要做到這一點需要編寫更多的編碼,但它并不難。首先檢查元素,如果它存在,等待預定義的時間段,然后再重新檢查。這在循環(huán)內(nèi)執(zhí)行,如果超過一個預定的超時,元素不存在則終止循環(huán)。
讓我們考慮頁面上實現(xiàn)AJAX效果的一個鏈接(鏈接= ajaxLink),可以使用循環(huán)處理:
// Loop initialization.
for (int second = 0;; second++) {
// If loop is reached 60 seconds then break the loop.
if (second >= 60) break;
// Search for element "link=ajaxLink" and if available then break loop.
try { if (selenium.isElementPresent("link=ajaxLink")) break; } catch (Exception e) {}
// Pause for 1 second.
Thread.sleep(1000);
}
這當然不是的解決辦法。Ajax是一個共同的話題,在用戶論壇上,查找一下之前的討論,看看別人是如何做的。