您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 > Selenium
Selenium自動化測試用例設計注意事項
作者:網絡轉載 發(fā)布時間:[ 2013/1/25 14:02:31 ] 推薦標簽:

  這個HTML錨標記定義了一個ID屬性為“adminHomeForm”按鈕。和大部分HTML標簽相比,這是一個相當復雜的錨標記,但它仍然是一個靜態(tài)標簽。每次頁面被瀏覽器加載時,HTML將保持不變。它的ID在所有的頁面實例里保持不變,也是說,頁面被展示時,這個UI元素總是有同樣的標識符。所以,點擊此按鈕的測試腳本(Selenium Server)如下所示:

selenium.click("adminHomeForm");

  然而,你的應用程序,可能生成動態(tài)的HTML標識符。在不同的網頁實例中,標識符發(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來定位元素,可以換一種不同的解決方案。您可以先捕捉到網站的這個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()方法來等待一個頁面元素變得可用。該參數是一個WebDriver用來實現定位的By對象。這是WebDriver的章節(jié)中詳細解釋。

  在Selenium 1.0(Selenium-RC的)中,要做到這一點需要編寫更多的編碼,但它并不難。首先檢查元素,如果它存在,等待預定義的時間段,然后再重新檢查。這在循環(huán)內執(zhí)行,如果超過一個預定的超時,元素不存在則終止循環(huán)。

  讓我們考慮頁面上實現AJAX效果的一個鏈接(鏈接= ajaxLink),可以使用循環(huán)處理:

// Loop initialization.
for (int second = 0;; second++) {
 
     // If loop is reached 60 seconds then break the loop.
     if (second &gt;= 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是一個共同的話題,在用戶論壇上,查找一下之前的討論,看看別人是如何做的。

上一頁1234下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd