Selenium用戶指南 - 第六章 Selenium 1 (Selenium RC)[2]

From: http://blog.csdn.net/planisnothing/article/details/7252952


瞭解API

Selenium RC API使用命名約定,假定你理解Selenese,大量的接口是自解釋的。在此,我們解釋最關鍵以及可能不太明顯的內容。

啓動瀏覽器

setUp("http://www.google.com/", "*firefox");

這些示例中的每一個打開瀏覽器,並分配瀏覽器“瀏覽器實例”給一個程序變量以代表這個瀏覽器。這個程序變量被使用於調用來自於瀏覽器的方法。

創建瀏覽器實例需要的參數是:


host指定服務器位於的計算機的IP地址。通常,這是與客戶端運行的相同的機器,在這種情況下,可以是localhost。在某些客戶驅動程序中中,這是一個可選參數。port指定服務器偵聽等待客戶連接的TCP/IP socket端口。在某些客戶驅動程序中這也是可選的。brower是你希望運行測試的瀏覽器。這時一個必須的參數。url測試中的應用程序的基url。這是所有的客戶端庫所必須的,這是用於啓動browser-proxy-AUT通訊的地完整信息。

注意,某些客戶端庫要求,要啓動瀏覽器必須顯式地調用它的start()方法。

運行命令

一旦你有一個初始化的瀏覽器,並分配給一個變量(通常命名爲“selenium”),你可以從瀏覽器變量,通過調用不同的方法讓它運行Selenese命令。

selenium.type(“field-id”,”string to type”)

在後臺,瀏覽器將實際執行一個鍵入操作,基本上與一個用戶在瀏覽器中鍵入一樣,但使用定位器和在調用中指定的字符串。

報告結果

Selenium RC沒有它自己的、用於報告的機制,他允許你使用選擇的編程語言按需構造一個報告。這很好,但如果你僅僅想要那些已經爲你準備好的東西哪?時常一個現存的類庫或測試框架可以滿足你的需要,比你自己開發測試報告代碼更快。

測試框架報告工具

對許多編程語言來說,測試框架是可得到的。這些,以及它們的主要功能,那個提供的一個靈活的測試引擎用來執行你的測試代碼的,包括用於報告結果的庫代碼。例如,Java有兩個常用的測試框架,JUnit和TestNG,.NET也有它自己的NUnit。

我們不會在此講解框架本身;那個超出了本用戶指南的範疇。我們僅僅介紹框架的特徵,那些與Selenium有關的以及你應用的某些技術。在internet上,可以獲得有關這些測試框架的很好的數據以及相關的信息。

測試報告庫

用於使用你選擇的編程語言報告測試結果的,特別創建的第三方庫也是可得到的。這些時常支持各種各樣的格式,包括HTML或PDF。

最好的方法是什麼?

大部分測試框架的新手從使用框架內置的報告功能開始。從那裏大多數人可以查看任何可得到的庫,因爲這比開發自己的要花更少的時間。當你開始使用Selenium時,毫無疑問你會爲報告過程開始投入你自己的“打印語句”。那會逐步地引導你開發你自己的報告,或並行地使用一個庫或測試框架。不管怎樣,在一個初期的,但很短的學習曲線後,你會自然地開發適合你情況的效果最好的東西。

測試報告示例

爲了演示,我們會引導你使用某些特定的、Selenium支持的某些語言的工具。在此列出的是由指南的作者常用的,以及得到廣泛使用的工具。

測試報告爲Java

    - 如果Selenium測試案例的開發使用JUnit,則JUnit報告可以被使用於生成測試報告。詳細說明參考JUnit Report

    - 如果Selenium測試案例使用TestNG開發,則生成測試報告沒有額外的工作需要做。TestNG框架生成一個HTML報告,列出測試結果的詳細信息。更多的信息參見TestNG Report。

    - ReportNG是TestNG框架的一個HTML報告插件。用於作爲一個默認TestNG的HTML報告的替代。ReportNG提供一個簡單、代碼着色的測試結果視圖。更多的信息參見ReportNG。

    - 同樣,如果需要一個很好的概要報告可試用一下TestNG-xslt。一個TestNG-xslt看起來像這樣。

更多的信息參見TestNG-xslt。

日誌Selenese命令

    - Logging Selenium可以用於生成在你的測試中所有Selenese命令以及每個執行成功或失敗的報告,Logging Selenium擴展Java客戶端驅動程序以增加Selenese的日誌能力。請參考Logging Selenium。

測試報告爲Phython

    - 當使用Python客戶端驅動程序時,可以使用HTML TestRunner生成測試報告。參見HTML TestRunner。

測試報告爲Ruby

    - 使用Ruby,如果RSpec被使用於編寫Selenium測試案例,那麼它的HTML報告可以用於生成測試報告。參考RSpec Report以獲得更多信息。

註釋

如果你對一個語言無關的獨立日誌將做什麼感興趣,可以看看Selenium Server Logging。

增加某些調味瓶到你的測試

現在我們將接觸到使用Selenium RC的全部理由,增加編程邏輯到你的測試。它與任何程序是相同的。程序流使用條件語句和迭代進行控制。此外,你可以報告進度信息使用I/O。在本節,我們將展示某些編程語言構造如何與Selenium結合解決公共的測試問題的示例。

你會發現,當你從簡單的頁面元素存在性的測試,到涉及多Web頁的動態功能和變化的數據的測試轉換時,你會需要編程邏輯來驗證預期的結果。基本上,Selenium IDE不支持迭代和標準的條件語句。你可以使用嵌入在Selenese參數的javascript完成某些條件語句,然而迭代是不可能的,而且大多數的條件語句使用一個編程語言更容易完成。此外,你可能需要異常處理用於錯誤恢復。爲這些以及其他的理由,我們編寫了本節去演示公共編程技術的使用,以便給於你在自動化測試中一個極大的“驗證能力”。

在本節的示例是使用C#和Java編寫的,然而這代碼是簡單的,可以容易地改寫到其他支持語言。如果你有有關面向對象編程語言的基礎知識,你應該沒有困難理解本節。

迭代

迭代是人們需要在他們的測試中完成的最普通的事情之一。例如,你可能希望執行一個搜索多次。或者,或許爲了驗證你的測試結果,你需要處理從一個數據庫返回的“結果集”。

使用我們較早使用的相同的Google搜索示例,讓我們檢查Selenium搜索結果。這個測試可以使用Selenese:

open /
type q selenium rc
clickAndWait btnG
assertTextPresent Results * for selenium rc
type q selenium ide
clickAndWait btnG
assertTextPresent Results * for selenium ide
type q selenium grid
clickAndWait btnG
assertTextPresent Results * for selenium grid

這個代碼已經被重複運行這相同的步驟3次。相同代碼的多個拷貝不是一個好的編程實踐,因爲需要做更多的工作去維護。通過使用編程語言,我們可以迭代搜索結果,提供一個更靈活和可維護的解決方案。

用C#:

// 一個字符串的集合

String[] arr = {"ide", "rc", "grid"};

// 循環執行數組中的每隔字符串

foreach (String s in arr) {
    sel.open("/");
    sel.type("q", "selenium " +s);
    sel.click("btnG");
    sel.waitForPageToLoad("30000");
    assertTrue("Expected text: " +s+ " is missing on page.", sel.isTextPresent("Results * for selenium " + s));
 }
 

條件語句

爲了演示在測試中使用條件語句,我們從一個示例開始。在運行Selenium測試時,一個公共的問題會出現,當在頁面中某個預期的元素是不可得到時。例如,當運行下面的代碼行時:

selenium.type("q", "selenium " +s);

如果元素“q”不在頁面上,那麼一個異常會拋出。

com.thoughtworks.selenium.SeleniumException: ERROR: Element q not found

這可能造成造成你的測試退出。對某些測試,那是你想要的。但當你的測試腳本有許多其他後面的測試的時候,這經常不是你想要。

一個更好的方法是首先驗證元素是否真正地呈現,然後在沒有的情況下采用替代的操作。讓我們以Java爲例。


// 如果元素是可得到的,則執行鍵入操作

if(selenium.isElementPresent("q")) {
    selenium.type("q", "Selenium rc");
} else {
    System.out.printf("Element: " +q+ " is not available on page.")
}
 

這個方法的好處是可以繼續測試的執行,即使某些UI元素是不可得到的。

從你的測試執行JavaScript

執行JavaScript非常方便。Selenium API的getEval方法可以使用於從Selenium RC執行JavaScript。

考慮一個包含一個沒有靜態標識符的複選框的應用程序。在這種情況下,你可以從Selenium RC執行JavaScript獲得所有複選框的id,然後檢查它們。

public static String[] getAllCheckboxIds () {
             String script = "var inputId  = new Array();";// Create array in java script.
             script += "var cnt = 0;"; // Counter for check box ids.
             script += "var inputFields  = new Array();"; // Create array in java script.
             script += "inputFields = window.document.getElementsByTagName('input');"; // Collect input elements.
             script += "for(var i=0; i<inputFields.length; i++) {"; // Loop through the collected elements.
             script += "if(inputFields[i].id !=null " +
             "&& inputFields[i].id !='undefined' " +
             "&& inputFields[i].getAttribute('type') == 'checkbox') {"; // If input field is of type check box and input id is not null.
             script += "inputId[cnt]=inputFields[i].id ;" + // Save check box id to inputId array.
             "cnt++;" + // increment the counter.
             "}" + // end of if.
             "}"; // end of for.
             script += "inputId.toString();" ;// Convert array in to string.
             String[] checkboxIds = selenium.getEval(script).split(","); // Split the string.
             return checkboxIds;
 }
 

計算頁面中圖像的數量:

selenium.getEval("window.document.images.length;");

記住在DOM表達式中使用windows對象,因爲默認引用window,而不是測試窗口。


© Copyright 2008-2012, Selenium Project. Last updated on Feb 02, 2012.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章