Selenium用戶指南 - 第三章 Selenium IDE[5]

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


匹配文本模式

如同定位器,模式是Selenese命令經常需要的參數類型。需要模式的命令例子,如verifyTextPresent,verifyTitle,verifyAlert,assertConfirmation,verifyText和verifyPrompt。正如上面所提及的,link定位器就是利用一個模式。模式允許你,通過特殊字符的使用,預期的文本來描述,而非精確地指定文本。

有三種類型的模式:通配符(globbing),正則表達式,以及精確(exact)

通配符模式

大部分人熟悉通配符,因爲它被使用在DOS的文件擴展名或Unix/Linux的命令行,如ls *.c。在這個示例中,通配符用於顯示所有存在於當前目錄下的以.c擴展名結束的文件。通配符是相當有限的。只有兩個特殊的字符被Selenium的實現所支持。

    * 解釋爲“匹配任何字符”,例如,無,單個字符或多個字符

    [] (字元類別)解釋爲“匹配任何在方括號中發現的任何一個單一的字符”。一個連字符可以用於指定一個字符範圍(在ASCII字符集中連續的)的簡寫方式。幾個示例讓字元類別的功能變得清楚:

    [aeiou] 匹配任何的小寫元音字符

    [0-9] 匹配任何數字

    [a-zA-Z0-9] 匹配任和字母數字字符

在大多數其他應用的上下文中,通配符包含第三個特殊的字符?。然而,Selenium通配符模式只支持*和字元類別。

要爲Selenese命令指定一個通配符模式參數,你可以給這個模式帶有glob:前綴標籤。然而,因爲通配符模式是默認的,可以忽略這個標籤僅僅指定模式。

下面是兩個使用通配符模式的命令示例。在頁面上實際被測試的鏈接的文本是“Film/Television Department”;通過使用模式而不是精確的文本,click命令將工作,即使鏈接的文本變成了“Film & Television Department” 或 “Film and Television Department”。通配符模式的*將匹配“任何或無”字符在單詞 “Film” 和“Television”之間。

Command          Target                                  Value
click                      link=glob:Film*Television Department     
verifyTitle              glob:*Film*Television*     

由點擊超級鏈接到達的頁面的實際標題是“De Anza Film And Television Department - Menu”。通過使用模式匹配而非精確的文本,只要單詞“Film”和“Television”出現(以這個順序)在頁面標題任何地方,verifyTitle將通過。例如,頁面的所有者可能縮寫頁面標題爲 “Film & Television Department” ,這個測試仍然將通過。在鏈接以及其他簡單測試(諸如verifyTitle )中使用模式,可以極大地減少此類測試的維護工作量。

正則表達式模式

正則表達式模式是三種Selenese支持的模式類型中最強大的模式。正則表達式也被大多數高級的編程語言支持,許多文本編輯器,許多工具,包括Linux/Unix命令行實用工具grep,sed,以及awk。在Selenese,正則表達式模式允許用戶執行許多那些多其他的方法來說非常困難的任務。例如,假定你的測試需要確保一個特定的表的單元格只能包含數字。regexp: [0-9]+是一個匹配任何長度的數字的簡單模式。

Selenese通配符模式僅僅支持*和[](字元類別)特徵,而Selenese正則表達式模式則提供了與在Javascript中同樣廣泛的特殊字符。下面是這些特殊字符的一個子集:

PATTERN     MATCH

.         任何單個字符

[ ]         字符類別:任何出現的括弧中的單個字符

*         數量:0或多個前面的字符(或組)

+         數量:1或多個前面的字符(或組)

?         數量:0或1個前面的字符(或組)

{1,5}         數量:1到5個前面的字符(或組)

|         可選:在左邊或右邊的字符/組

( )         分組:常用於可選和/或數量

在Selenese中,正則表達式模式需要帶有regexp: 或regexpi: 前綴。前者是大小寫敏感的,後者是不敏感的。

幾個示例將有助於澄清正則表達式可以如何被使用在Selenese命令中。第一個使用可能是最常用的正則表達式 - “.*”。這兩個字符序列可以被解釋作“0次或多次出現的任何字符”或更簡單地,“有或沒有”。這等價於通配符模式的*(一個單一的星號)。

Command      Target                     Value
click                  link=regexp:Film.*Television Department     
verifyTitle          regexp:.*Film.*Television.*     

上面的事例在功能上與較早的、使用通配符的測試示例相同。唯一的差別是前綴(regexp: 替代了 glob:)和這“有或無”模式(.* 替代了單一的*)。

下面更復雜的示例測試Yahoo! Weather(天氣)頁面的Anchorage, Alaska(阿拉斯加的安克雷奇)包含的有關日出的信息。

Command             Target                             Value
open                 http://weather.yahoo.com/forecast/USAK0012.html     
verifyTextPresent         regexp:Sunrise: *[0-9]{1,2}:[0-9]{2} [ap]m     

讓我們逐步地檢視一下上面的正則表達式:

Sunrise: *    字符串Sunrise:跟着0或多個空格

[0-9]{1,2}     1個或2個數字(每天的小時)

:      字符:(沒有特殊字符涉及)

[0-9]{2}    2個數字(分鐘)跟着一個空格

[ap]m    “a”或“p”跟着“m”

精確匹配

Selenium的精確模式具有邊際用途。它根本不使用特殊的字符。如此,如果你需要查找一個實際的*號(對通配符和正則表達式模式是特殊字符),精確模式是完成它的一種方法。例如,如果你希望從下拉列表中選擇一個帶標籤“Real *”的選項,下面的代碼可能工作也可能不工作。星號在glob:Real *模式中,會匹配任何字符或無字符。這樣,如果有一個更靠前的帶有標籤“Real Numbers”的選擇項將被選擇,而不是 “Real *” 選項。


select    //select   glob:Real *

爲了確保 “Real *” 項被選擇,exact:前綴可以使用於創建一個精確匹配模式,如下所示:

select   //select   exact:Real *

當然,可以通過在正則表達式中轉義*達成相同的效果:

select     //select     regexp:Real \*

對大多數的測試者不太可能需要查找一個*號或一對方括號(通配符中的字元類別)。因此,通配符模式和正則表達式模式對我們大多數人來說是足夠的。

“AndWait”命令

一個命令和它的AndWait替代之間的區別是,規則的命令(例如click)將執行一個動作,然後儘可能快地繼續到下一個命令,然而AndWait替代(例如clickAndWait)會告訴Selenium在動作完成後,等待頁面被裝載。

AndWait替代通常被使用在,當一個動作引起瀏覽器導航到另外一個頁面或重新裝載當前的頁面的時候。

需要注意的是,如果你使用一個不會觸發導航/刷新的動作的AndWait命令時,你的測試會失敗。這會發生,因爲Selenium會到達AndWait的超時而沒有看到任何導航或刷新做出,從而引起Selenium引發一個超時異常。

在AJAX應用程序中的waitFor命令

在AJAX驅動的Web應用程序中,數據從服務器端獲取,但不會刷新頁面。使用andWait命令將不會工作,因爲頁面沒有實際的刷新。暫停測試的執行一段時間也不是一個好的方法,因爲Web元素可能依賴於系統的響應能力,裝載或其他不可控制的因素,而出現在規定的期限的前或後,從而導致測試的失敗。最好的方法是在一個動態的期限內等待需要的元素,然後一旦這個元素被發現就繼續執行。

這可以完成使用一個waitFor命令,如waitForElementPresent或waitForVisible,動態地等待,每間隔一秒檢查要求的條件,一旦條件滿足則繼續腳本中下一條命令的執行。

計算和流控制序列

當運行一個腳本時,它會簡單地按順序運行,一個命令跟着一個。

Selenese本身不支持條件語句(如if-else)或迭代(如for,while)。許多有用的測試可以無需流控制而執行。然而,對於一個動態內容的功能性測試,可能涉及到多頁,編程的邏輯時常是需要的。

當流控制需要時,有三個選項:

    運行腳本使用Selenium-RC和一個客戶端庫,諸如Java或PHP,利用編程語言的流控制功能。

    在測試腳本中使用storeEval命令運行一小段Javascript代碼段

    安裝goto_sel_ide.js擴展

大多數的測試者,使用Selenium RC API,導出測試腳本到一個編程語言文件(見Selenium IDE章節)。然而,一些組織,只要可能,更願意直接運行從Selenium IDE他們的測試腳本(例如,當他們有許多低級別的開發人員爲他們運行測試的時候,或者編程技能不足的時候)。如果這是你的情況,考慮使用Javascript代碼段或goto_sel_ide.js擴展。

存儲命令和Selenium變量

你可以,在腳本的開始,使用Selenium變量去存儲常量。同樣,當與一個數據驅動的測試設計結合時(在後面部分討論),Selenium變量可以用於存儲,從命令行、其他程序或文件,傳遞給你的測試程序的值。

普通的store命令是許多存儲命令的基礎,可以使用於存儲簡單的常量值在Selenium變量中。它帶有兩個參數,被存儲的文本值以及一個Selenium變量。當選擇一個你的變量的名稱時,使用標準的、僅使用字母數字字符的變量命名約定。

Command        Target            Value
store        [email protected]            userName

稍後在你的腳本中,你會想要使用這個存儲的變量值。去存取這個變量值,將變量裝入大括弧({})中,並且前置一個美元符號,像下面這個。

Command        Target        Value
verifyText        //div/p    ${userName}


經常使用變量於存儲輸入域的輸入。

Command    Target    Value
type    id=login    ${userName}

Selenium變量可以被使用於第一個和第二個參數,Selenium會先於命令執行的任何其他操作,解釋變量。Selenium變量也可以用於定位器表達式中。

每一個verify和assert命令都存在一個對等的store命令。這裏是幾個經常使用的存儲命令。

storeElementPresent

對應於verifyElementPresent。僅僅存儲一個布爾值“true”或“false”,依賴於是否UI元素被發現。

storeText

對應於verifyText。使用一個定位器識別特定的頁面文本。文本如果發現就存儲在變量中。它可以用於從頁面中抽取文本。

storeEval

該命令帶有一個腳本作爲第一個參數。在Selenese中嵌入Javascript在下一節討論。這個命令允許測試存儲運行腳本的結果在一個變量中。

Javascript和Selenese參數

Javascript可以應用於兩種類型的Selenese參數:腳本和非腳本(通常是表達式)。在大多數的情況下,你會想要,在被使用作一個Selenese參數的Javascript代碼段中,存取和/或操縱一個測試案例的變量。所有的在你的測試案例中創建的變量,都存儲在一個Javascript關聯數組中。關聯數組具有字符串索引,而非順序的數字索引。包含你的測試案例的關聯數組被命名爲storedVars。當你希望在Javascript代碼段中存取或操作變量的時候,你必須引用它做storedVars[‘你的變量名’]。

Javascript的腳本參數用法

有幾個Selenese命令可以指定腳本參數,包括assertEval,verifyEval,storeEval,和等待waitForEval。這些參數無需特殊的語法。Selenium IDE的用戶只需簡單地將一個Javascript的代碼段放入到適當的域中,通常是目標(Target)域(因爲一個腳本參數通常是第一個或唯一的一個參數)。

下面的示例演示一個Javascript代碼段是如何應用於執行一個簡單的數值計算:

Command             Target                         Value
store                 10                         hits
storeXpathCount         //blockquote                     blockquotes
storeEval             storedVars[‘hits’]-storedVars[‘blockquotes’]     paragraphs

下面的示例演示一個Javascript代碼段可以包含對函數的調用,在這個示例中,是對String對象的toUpperCase和toLowerCase方法的調用。

Command                 Target                     Value
store                     Edith Wharton                 name
storeEval                 storedVars[‘name’].toUpperCase()     uc
storeEval                 storedVars[‘name’].toLowerCase()     lc

Javascript的非腳本參數用法

Javascript也可以用於生成參數的值,甚至參數沒有被指定爲具有腳本類型。然而,在這種情況下,需要使用特殊的語法 - Javascript代碼片斷必須被包圍在封閉的大括弧({})中,並且帶有javascript的標籤前綴,如javascript {這兒是你的代碼}。下面是一個示例,type命令的第二個參數置是由Javascript代碼使用特殊的語法生成的。

Command Target Value
store league of nations searchString
type q javascript{storedVars[‘searchString’].toUpperCase()}

echo - Selenese打印命令

Selenese有一個簡單的命令,允許你打印文本到你的測試輸出。這是有用的,對於提供你信息性進度說明,當你的測試正在運行時,顯示在控制檯。這些說明也可以爲你的測試結果報告提供上下文,可以被使用於你的測試發現一個問題時,查找缺陷存在在頁面的哪裏。最後,echo語句可以使用於打印Selenium變量的內容。

Command Target Value
echo Testing page footer now.  
echo q Username is ${userName}

警告,彈出和多窗口

假定你正在測試一個頁面,看起來像這樣。


1<!DOCTYPE HTML>
2<html>
3<head>
4  <script type="text/javascript">
5    function output(resultText){
6      document.getElementById('output').childNodes[0].nodeValue=resultText;
7    }
8
9    function show_confirm(){
10      var confirmation=confirm("Chose an option.");
11      if (confirmation==true){
12        output("Confirmed.");
13      }
14      else{
15        output("Rejected!");
16      }
17    }
18
19    function show_alert(){
20      alert("I'm blocking!");
21      output("Alert is gone.");
22    }
23    function show_prompt(){
24      var response = prompt("What's the best web QA tool?","Selenium");
25      output(response);
26    }
27    function open_window(windowName){
28      window.open("newWindow.html",windowName);
29    }
30    </script>
31</head>
32<body>
33
34  <input type="button" id="btnConfirm" onclick="show_confirm()" value="Show confirm box" />
35  <input type="button" id="btnAlert" onclick="show_alert()" value="Show alert" />
36  <input type="button" id="btnPrompt" onclick="show_prompt()" value="Show prompt" />
37  <a href="newWindow.html" id="lnkNewWindow" target="_blank">New Window Link</a>
38  <input type="button" id="btnNewNamelessWindow" onclick="open_window()" value="Open Nameless Window" />
39  <input type="button" id="btnNewNamedWindow" onclick="open_window('Mike')" value="Open Named Window" />
40
41  <br />
42  <span id="output">
43  </span>
44</body>
45</html>

用戶必須響應alert/confirm對話框,以及移動焦點到新打開的彈出窗口 。幸運地是,Selenium可以替代javascript彈出窗口。

但在我們開始分別討論alert/confirm/prompt的細節前,理解它們之間的共性是有益的。警告,確認和提示對話框都有下面的變種

Command             Description

assertFoo(pattern)         拋出錯誤,如果模式不匹配彈出的文本

assertFooPresent         拋出錯誤如果彈出是不可得到的

assertFooNotPresent         拋出錯誤如果任何彈出呈現

storeFoo(variable)         存儲彈出的文本到變量

storeFooPresent(variable)     存儲彈出文本在變量,然後返回true或false

當在Selenium運行時,Javascript彈出窗口不會出現。這是因爲函數調用在運行時實際上被Selenium自己的Javascript重寫了。不管怎樣,不能因爲你不能看到彈出窗口,就意味着你不必處理它。要處理一個彈出窗口,你必須調用assertFoo(pattern)函數。如果你在斷言一個彈出窗口的出現時失敗,你的下一個命令將會被阻塞,你會得到一個錯誤,類似於這下面[error] Error: There was an unexpected Confirmation! [Chose an option]

警告

讓我們從警告開始,因爲這是最簡單的需要處理的彈出。要開始,首先在瀏覽器中打開上面的那個樣品頁面,然後點擊“Show alert”按鈕。你會注意到在你關閉了這個alert對話框後,文本“Alert is gone."被顯示在頁面上。現在運行這相同的步驟,並用Selenium IDE錄製下來,然後驗證文本是否在你關閉警告後被增加了。你的測試看起來像這個:

Command         Target         Value
open             /     
click             btnAlert     
assertAlert         I’m blocking!     
verifyTextPresent     Alert is gone.     

你可能覺得“那時奇怪的,我從沒有斷言那個警告。”。但這是Selenium  IDE處理的和爲你關閉了這個警告。如果你移出那個步驟並回放這個測試,你會得到下面的錯誤:[error] Error: There was an unexpected Alert! [I'm blocking!]。你必須包含一個警告的斷言去認可它的出現。

如果你只是想要去斷言一個出現的警告,但既不知道也不在乎它包含啥文本,你可以使用assertAlertPresent。這將返回一個true或false,在爲false時,將停止這個測試。

確認

確認的行爲和警告的完全一致,使用assertConfirmation和assertConfirmationPresent提供如同警告的對應操作相同的特徵。然而,默認地當一個確認彈出時,Selenium將選擇OK。試着錄製點擊在相同頁面的“Show confirm box”按鈕,但在彈出得確認對話框中點擊"Cancel"按鈕,然後斷言這輸出的文本,你的測試看起來像這個:


Command             Target         Value
open                 /     
click                 btnConfirm     
chooseCancelOnNextConfirmation           
assertConfirmation         Choose an option.     
verifyTextPresent         Rejected     

chooseCancelOnNextConfirmation 函數告訴Selenium,所有後面的確認對話框應該返回false。這可以被重置,通過調用chooseOkOnNextConfirmation。

你可能注意到,你不能回放這個測試,因爲Selenium抱怨有一個沒有處理的確認。Selenium IDE錄製事件的順序,引起click和chooseCancelOnNextConfirmation的順序錯誤(如果你仔細考慮會認爲這是合理的,在你打開確認對話框前,Selenium不知道你會取消)。只需切換兩個命令的順序,你的測試將運行良好。


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

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