Selenium簡介(二)--基於CORE/IDE的簡單應用

Selenium簡介--總體介紹

  上篇文章我們總體介紹了Selenium,在這篇文章裏,讓我們一起了解下Selenium基於CORE/IDE的簡單應用。在開始前,我們先回顧下上篇文章中的內容:
  Selenium Core是Selenium的核心部分,它由一些純js代碼組成, 可以運行在windows/linux的不同browser上, 而IDE是在core的基礎上的一種應用, 通過UI實現類似QTP/Winner的腳本錄製回放功能。


  Core的運行模式主要有:
  1. Selenium IDE 運行
  利用IDE插件加載core引擎,運行測試腳本。主要用於腳本錄製調試,類似於開發工具的調試,一般不應用於測試。
  2. 部署於被測對象服務器上,以http方式運行
  將core核心引擎和測試代碼部署與被測對象的Web服務器上,以http請求的方式運行。
  3. 本地模式HTA and Chrome
  HTA模式是在IE下運行,Chrome是在Firefox下運行。這個兩個的原理都是利用瀏覽器的本地化模式,調用主html文件--Test Runner 加載核心引擎庫,執行test suite裏的測試用例。


  Selenium IDE說明:
  Selenium IDE是通過監聽用戶對html頁面的操作來錄製腳本的,是真正能夠監聽用戶對html頁面的操作的錄製工具。 Selenium IDE可以生成7種語言的腳本:html,java,C#,ruby,python,perl,php。
  你可以直接在FireFox中將Selenium IDE打開,執行html格式的腳本。 
  如果你要執行其他語言格式的Selenium腳本,那麼,你需要使用Selenium服務器,使用RC模式。6種語言的使用方法都是一樣的。

  在簡單的回顧了上篇文章的內容後,讓我們開始進入實踐環節,自動化測試的關鍵,當然是要有測試腳本,Selenium core的測試腳本是html格式的,如過你很熟悉的話,可以自己手工編寫測試腳本。當然,Selenium core也提供了腳本錄製的工具—Selenium IDE。下面,我們就從腳本錄製開始,使用Selenium core完成一個簡單的測試腳本。


  一、 準備工作:
  1. Mozilla Firefox
  下載地址:
  http://www.mozillaonline.com/
  安裝後設置:
  屏蔽‘阻止彈出窗口
 

  2. Selenium IDE
  下載地址:
  http://release.openqa.org/selenium-ide/1.0-beta-2/selenium-ide-1.0-beta-2.xpi
  安裝:
  利用FireFox打開這個文件或者直接在FireFox中打開IDE鏈接後安裝。
  重新啓動FireFox,打開‘工具’ 菜單,點擊 Selenium IDE 後即可彈出IDE窗口。

  3. Selenium Core
  下載地址:
  http://release.seleniumhq.org/selenium-core/1.0-beta-2/selenium-core-1.0-beta-2.zip
  4. UltraEdit
  推薦安裝,用於編輯修改html運行腳本。

  二、 錄製腳本
  準備工作做好後,讓我們使用IDE來錄製腳本。啓動Firefox瀏覽器,在Firefox菜單欄中單擊“工具”菜單,我們會看到Selenium IDE是其子菜單:



 
  單擊Selenium IDE項我們可以看到彈出Selenium IDE窗口:   


  然後我們就可以使用Selenium IDE進行錄製了。切換的Firefox 瀏覽器,在地址欄輸入www.google.cn,訪問google。流程爲:打開Google首頁->在google搜索框中輸入“Google 黑板報”->左鍵單擊“google 搜索”按鈕->在新頁面選中“Google 中國的博客網誌”,鼠標單擊右鍵,在下列列表中選擇verifyTextPresent項以驗證搜索成功。如下圖:
 

  回到IDE界面,單擊錄製按鈕停止錄製。然後就可以單擊播放按鈕播放我們剛錄製的腳本了,如下圖:
 

  點擊Source標籤,我們可以看到如下的html格式腳本:
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">New Test</td></tr>
</thead><tbody>
<tr>
 <td>open</td>
 <td>/</td>
 <td></td>
</tr>
<tr>
 <td>type</td>
 <td>q</td>
 <td>Google 黑板報</td>
</tr>
<tr>
 <td>clickAndWait</td>
 <td>btnG</td>
 <td></td>
</tr>
<tr>
 <td>verifyTextPresent</td>
 <td>Google 中國的博客網誌</td>
 <td></td>
</tr>
</tbody></table>
 

  如果你瞭解html,你就會看到,Selenium core的腳步命令式以table的格式編寫的,一行(<tr>*</tr>)代表一個步驟。每行的第一列(<td>*</td>),是Command 或者 Action,指示Selenium要幹什麼。第二列是被操作目標,如要點擊的button id,要輸入的text id等。第三列是該動作(Command or action)需要的參數。如上面的html腳本在瀏覽器顯示如下:

New Test
open /  
type q Google 黑板報
clickAndWait btnG  
verifyTextPresent Google 中國的博客網誌  

 
  第一行的作用是open一個url, 因爲在Selenium IDE裏自動指定了baseURL,所以這裏的被操作對象是一個”/”, 代表打開baseURL。如下圖:
 

  因此,在編寫腳本時,要注意給baseURL賦值,或者直接指定url。
  第二行type命令,向id 是q的文本框輸入“Google 黑板報”。
  第三行clickAndWait命令,單擊id是btnG的button,並等待頁面提交成功。
  第四行verifyTextPresent命令,在頁面上驗證有沒有“Google 中國的博客網誌”的文本。

  另外需要說明的是,我們可以使用Selenium的菜單欄“Options”菜單中的“Format”子菜單將腳本轉化爲各自所需的語言類型。

  三、 編輯部署腳本
  在上次我們介紹了詳細的Selenium Core腳本的錄製與回放。在腳本編寫好後,我們如何部署我們的腳步呢?這裏有一個關鍵的概念—Test Suite,即,一些test case的集合。
  你可以在Selenium core的tests目錄下找到這個文件:TestSuite.html, 如下:
Test Suite
TestUseXpathLibrary
TestMouseEvents

 

  我們只要將Test Suite的連接,指向我們的test case就可以了。一個Test Suite,可以指向N個Test case。下面,我們就詳細介紹各個步驟。
  1. 將我們編寫好後的腳本保存在磁盤上。假定我們將其存放在D:\Selenium\TestCase目錄下。文件名爲testGoogle.html
  2. 將Selenium Core包裏的core目錄解壓到D:\Selenium目錄下。Selenium目錄的結構如下:
  D:\Selenium
           Core
           TestCase
  3. 拷貝TestSuite.html到Test Case目錄下,修改連接指向我們的Test case。
Test Suite
Test Google

 

  這樣,我們的腳本和Test Suite就準備好了,當然,這只是我們的學習用例,真正的測試基本的部署,需要考慮腳本的架構、模塊的劃分、後續的維護等等方面,在後續,我們有專門的章節來討論。本章只是簡單部署下,瞭解爲主。

  四、 本地模式運行測試腳本
  在上次,我們簡單介紹了Selenium的運行模式,我們的測試腳本和Test Suite已經完成,下面我們分別用三種模式,來運行我們的Test case。
  1. HTA模式運行
  HTA是HTML Application的縮寫(HTML應用程序),直接將HTML保存成HTA的格式,就是一個獨立的應用軟件,這種模式可以讓你避開瀏覽器安全的限制。當你需要在客戶端創建被腳本標記爲不安全的組件時,它就很有用處了;因此,用這種模式,可以避開安全錯誤以及一些錯誤彈出窗口。
因此,Selenium core模式下,我們可以直接通過hta模式來運行我們的測試腳本,具體步驟如下:
  1.1 運行D:\Selenium\core目錄下的TestRunner.hta,如下圖
 

  1.2 在Test Suite輸入框裏,輸入Test Suite的地址,如下圖:
 

  這裏的地址是html的相對地址,當然,你也可以輸入絕對地址,但不推薦這樣做。
然後點擊按鈕“go”,就轉到TestSuite頁面了。
  1.3 右側操作欄有4個按鈕,從左到右分別是“執行全部case、執行選中case、暫停和按步驟執行”,點擊“執行全部case”,我們的測試用例就會被執行。
  2. Chrome模式運行
  在Mozilla下,通過Mozilla的chrome系統,安裝於Mozilla的插件包可以用特殊的chrome URL關聯訪問。Chrome的全稱是統一資源定位器。插件包安裝過之後具有不受安全限制的優點,因此,和基於IE的hta模式具有同樣優點,可以解決web測試中的跨站及安全限制問題。
  用Chrome運行Selenium Core的步驟如下:
  2.1 前提條件:安裝了Mozilla Firefox,Mozilla Firefox安裝了Selenium ide的插件包。
  2.2 打開Firefox,輸入如下url:
  chrome://selenium-ide/content/selenium/TestRunner.html?test=file:///D:/selenium/TestCase/TestSuite.html&userExtensionsURL=&baseURL=http://www.google.cn
  上面的url,第一處紅色的部分是指定Test Suite的本地地址 ,第二處紅色的部分,是指定本次測試的baseURL。
  2.3 運行後,出現TestRunner頁面,具體操作與1同。
  3. 部署在被測目標服務器上
  將Selenium core 和 測試用例與被測對象部署在同一個web服務器上,訪問core目錄下的TestRunner.html來測試被測對象。TestRunner.html和TestRunner.hta的界面操作相同。

  五、 附Selenium Core命令指南

  參考地址:http://release.seleniumhq.org/selenium-core/1.0/reference.html

一、  Commands (命令)

Action
對當前狀態進行操作
失敗時,停止測試
Assertion
校驗是否有產生正確的值
Element Locators
指定HTML中的某元素
Patterns
用於模式匹配
1. Element Locators (元素定位器)

id=id
id locator 指定HTML中的唯一id的元素 
 name=name
name locator指定 HTML中相同name的元素中的第一個元素
 identifier=id
identifier locator 首先查找HTML是否存在該id的元素, 若不存在,查找第一個該name的元素 
dom=javascriptExpression
dom locator用JavaScript表達式來定位HTML中的元素,注意必須要以"document"開頭
例如:
dom=document.forms['myForm'].myDropdown
dom=document.images[56]
 xpath=xpathExpression
xpath locator用 XPath 表達式來定位HTML中的元素,必須注意要以"//"開頭
例如:
xpath=//img[@alt='The image alt text']
xpath=//table[@id='table1']//tr[4]/td[2]
 link=textPattern
link locator 用link來選擇HTML中的連接或錨元素
例如:
link=The link text
在沒有locator前序的情況下 Without a locator prefix, Selenium uses:
如果以"document."開頭,則默認是使用 dom locator,如果是以"//"開頭,則默認使用xpath locator,其餘情況均認作identifier locator
2. String Matching Patterns (字符串匹配模式)

glob:patthern
glob模式,用通配符"*"代表任意長度字符,"?"代表一個字符
regexp:regexp
正則表達式模式,用JavaScript正則表達式的形式匹配字符串
exact:string
精確匹配模式,精確匹配整個字符串,不能用通配符
在沒有指定字符串匹配前序的時候,selenium 默認使用golb 匹配模式
3. Select Option Specifiers (Select選項指定器)

label=labelPattern
通過匹配選項中的文本指定選項
例如:label=regexp:^[Oo]ther
value=valuePattern
通過匹配選項中的值指定選項
例如:value=other
id=id
通過匹配選項的id指定選項
例如: id=option1
index=index
通過匹配選項的序號指定選項,序號從0開始
例如:index=2
在沒有選項選擇前序的情況下,默認是匹配選項的文本
二、 Actions
描述了用戶所會作出的操作。
Action 有兩種形式: action和actionAndWait, action會立即執行,而actionAndWait會假設需要較長時間才能得到該action的相響,而作出等待,open則是會自動處理等待時間。

click
click(elementLocator)
- 點擊連接,按鈕,複選和單選框
- 如果點擊後需要等待響應,則用"clickAndWait"
- 如果是需要經過JavaScript的alert或confirm對話框後才能繼續操作,則需要調用verify或assert來告訴Selenium你期望對對話框進行什麼操作。 click  aCheckbox   
clickAndWait  submitButton   
clickAndWait  anyLink   

open
open(url)
- 在瀏覽器中打開URL,可以接受相對和絕對路徑兩種形式
- 注意:該URL必須在與瀏覽器相同的安全限定範圍之內 open  /mypage   
open  http://localhost/   

type
 type(inputLocator, value)
- 模擬人手的輸入過程,往指定的input中輸入值
- 也適合給複選和單選框賦值
- 在這個例子中,則只是給鉤選了的複選框賦值,注意,而不是改寫其文本 type  nameField  John Smith 
typeAndWait  textBoxThatSubmitsOnChange  newValue 

select
select(dropDownLocator, optionSpecifier)
- 根據optionSpecifier選項選擇器來選擇一個下拉菜單選項
- 如果有多於一個選擇器的時候,如在用通配符模式,如"f*b*",或者超過一個選項有相同的文本或值,則會選擇第一個匹配到的值 select   dropDown  Australian Dollars 
select   dropDown  index=0 
selectAndWait  currencySelector  value=AUD 
selectAndWait  currencySelector  label=Auslian D*rs 

 goBack,close
goBack()
模擬點擊瀏覽器的後退按鈕
close()
模擬點擊瀏覽器關閉按鈕
selectWindow
select(windowId)
- 選擇一個彈出窗口
- 當選中那個窗口的時候,所有的命令將會轉移到那窗口中執行 selectWindow  myPopupWindow   
selectWindow  null   

pause
pause(millisenconds)
- 根據指定時間暫停Selenium腳本執行
- 常用在調試腳本或等待服務器段響應時 pause  5000   
pause  2000   

fireEvent
 fireEvent(elementLocatore,evenName)
模擬頁面元素事件被激活的處理動作 fireEvent  textField  focus 
fireEvent  dropDown  blur 

waitForCondition
waitForCondition(JavaScriptSnippet,time)
- 在限定時間內,等待一段JavaScript代碼返回true值,超時則停止等待 waitForCondition  var value=selenium.getText("foo"); value.match(/bar/);  3000 

waitForValue
waitForValue(inputLocator, value)
- 等待某input(如hidden input)被賦予某值,
- 會輪流檢測該值,所以要注意如果該值長時間一直不賦予該input該值的話,可能會導致阻塞 waitForValue  finishIndication  isfinished 
     

store,stroreValue
store(valueToStore, variablename)
保存一個值到變量裏。
該值可以由自其他變量組合而成或通過JavaScript表達式賦值給變量 store  Mr John Smith  fullname 
store  $.{title} $.{firstname} $.{suname}  fullname 
store  javascript.{Math.round(Math.PI*100)/100}  PI 
storeValue  inputLocator  variableName 

把指定的input中的值保存到變量中

storeValue  userName  userID 
type  userName  $.{userID} 

storeText, storeAttribute
storeText(elementLocator, variablename)
把指定元素的文本值賦予給變量 storeText  currentDate  expectedStartDate 
verifyValue  startDate  $.{expectedStartDate} 

storeAttribute(.{}elementLocator@attributeName,variableName.{})
把指定元素的屬性的值賦予給變量

storeAttribute  input1@class   classOfInput1 
verifyAttribute  input2@class  $.{classOfInput1} 

chooseCancel.., answer..
chooseCancelOnNextConfirmation()
- 當下次JavaScript彈出confirm對話框的時候,讓selenium選擇Cancel
- 如果沒有該命令時,遇到confirm對話框Selenium默認返回true,如手動選擇OK按鈕一樣 chooseCancelOnNextConfirmation      

- 如果已經運行過該命令,當下一次又有confirm對話框出現時,也會同樣地再次選擇Cancel
answerOnNextPrompt(answerString)
- 在下次JavaScript彈出prompt提示框時,賦予其anweerString的值,並選擇確定

answerOnNextPrompt  Kangaroo   

三、 Assertions
允許用戶去檢查當前狀態。兩種模式: Assert 和 Verify, 當Assert失敗,則退出測試;當Verify失敗,測試會繼續運行。

assertLocation, assertTitle
assertLocation(relativeLocation)
判斷當前是在正確的頁面 verifyLocation  /mypage   
assertLocation  /mypage   

assertTitle(titlePattern)
檢查當前頁面的title是否正確 verifyTitle  My Page   
assertTitle  My Page   

assertValue
assertValue(inputLocator, valuePattern)
- 檢查input的值
- 對於 checkbox或radio,如果已選擇,則值爲"on",反之爲"off" verifyValue  nameField  John Smith 
assertValue  document.forms[2].nameField  John Smith 

assertSelected, assertSelectedOptions
assertSelected(selectLocator, optionSpecifier)
檢查select的下拉菜單中選中的選型是否和optionSpecifer(Select選擇選項器)的選項相同 verifySelected  dropdown2  John Smith 
verifySelected  dorpdown2  value=js*123 
assertSelected  document.forms[2].dropDown  label=J*Smith 
assertSelected  document.forms[2].dropDown  index=0 

assertSelectOptions(selectLocator, optionLabelList)
- 檢查下拉菜單中的選項的文本是否和optionLabelList相同
- optionLabelList是以逗號分割的一個字符串 verifySelectOptions  dropdown2  John Smith,Dave Bird 
assertSelectOptions  document.forms[2].dropdown  Smith,J,Bird,D 

assertText
assertText(elementLocator,textPattern)
- 檢查指定元素的文本
- 只對有包含文本的元素生效
- 對於Mozilla類型的瀏覽器,用textContent取元素的文本,對於IE類型的瀏覽器,用innerText取元素文本 verifyText  statusMessage  Successful 
assertText  //div[@id='foo']//h1  Successful 

assertTextPresent, assertAttribute
assertTextPresent(text)
檢查在當前給用戶顯示的頁面上是否有出現指定的文本 verifyTextPresent  You are now logged in   
assertTextPresent  You are now logged in   

assertAttribute(.{}elementLocator@attributeName.{}, ValuePattern)
檢查當前指定元素的屬性的值 verifyAttribute  txt1@class  bigAndBlod 
assertAttribute  document.images[0]@alt  alt-text 
verifyAttribute  //img[@id='foo']/alt  alt-text 

assertTextPresent, etc.
assertTextPresent(text)
assertTextNotPresent(text)
assertElementPresent(elementLocator)  verifyElementPresent    submitButton     
 assertElementPresent    //img[@alt='foo']      assertElementNotPresent(elementLocator) 

assertTable
assertTable(cellAddress, valuePattern)
- 檢查table裏的某個cell中的值
- cellAddress的語法是tableName.row.column, 注意行列序號都是從0開始 verifyTable  myTable.1.6  Submitted 
assertTable  results0.2  13 

assertVisible, nonVisible
assertVisible(elementLocator)
- 檢查指定的元素是否可視的
- 隱藏一個元素可以用設置css的'visibility'屬性爲'hidden',也可以設置'display'屬性爲'none' verfyVisible  postcode   
assertVisible  postcode   

assertNotVisible(elementLocator)  verfyNotVisible    postcode     
 assertNotVisible    postcode     

Editable, non-editable
assertEditable(inputLocator)
檢查指定的input是否可以編輯 verifyEditable  shape   
assertEditable  colour   

assertNotEditable(inputLocator)
檢查指定的input是否不可以編輯
assertAlert
assertAlert(messagePattern)
- 檢查JavaScript是否有產生帶指定message的alert對話框
- alert產生的順序必須與檢查的順序一致
- 檢查alert時會產生與手動點擊'OK'按鈕一樣的效果。如果一個alert產生了,而你卻沒有去檢查它,selenium會在下個action中報錯。
- 注意:Selenium 不支持 JavaScript 在onload()事件時 調用alert();在這種情況下,Selenium需要你自己手動來點擊OK.
assertConfirmation
assertConfirmation(messagePattern)
- 檢查JavaScript是否有產生帶指定message的confirmation對話框和alert情況一樣,confirmation對話框也必須在它們產生的時候進行檢查
- 默認情況下,Selenium會讓confirm() 返回true, 相當於手動點擊Ok按鈕的效果。你能夠通過chooseCancelOnNextConfirmation命令讓confirm()返回false.同樣地,如果一個cofirmation對話框出現了,但你卻沒有檢查的話,Selenium將會在下個action中報錯
- 注意:在Selenium的環境下,confirmation對話框框將不會再出現彈出顯式對話框
- 注意:Selenium不支持在onload()事件時調用confirmation對話框,在這種情況下,會出現顯示confirmatioin對話框,並需要你自己手動點擊。
 assertPrompt
assertPrompt(messagePattern)
- 檢查JavaScript是否有產生帶指定message的Prompt對話框
- 你檢查的prompt的順序Prompt對話框產生的順序必須相同
- 必須在verifyPrompt之前調用answerOnNextPrompt命令
- 如果prompt對話框出現了但你卻沒有檢查,則Selenium會在下個action中報錯 answerOnNextPrompt  Joe   
click  id=delegate   
verifyPrompt  Delegate to who?   

四、 Parameters and Variables
參數和變量的聲明範圍由簡單的賦值到JavaScript表達式賦值。
Store,storeValue 和storeText 爲下次訪問保存值。
在Selenium內部是用一個叫storeVars的map來保存變量名。

Variable Substitution 變量替換
提供了一個簡單的方法去訪問變量,語法 $.{xxx} store  Mr  title 
storeValue  nameField  surname 
store  $.{title} $.{suname}  fullname 
type  textElement  Full name is: $.{fullname} 

 JavaScript Evaluation JavaScript賦值
你能用JavaScript來構建任何你所需要的值。
這個參數是以javascript開頭,語法是 javascript.{'with a trailing'}。
可以通過JavaScript表達式給某元素賦值。 store  javascript.{'merchant'+(new Date()).getTime()}  merchantId 
type  textElement  javascript.{storedVars['merchantId'].toUpperCase()} 

Generating Unique values 產生唯一值. 
問題:你需要唯一的用戶名
解決辦法: 基於時間來產生用戶名,如'fred'+(new Date().getTime()) Selenium簡介--總體介紹

  上篇文章我們總體介紹了Selenium,在這篇文章裏,讓我們一起了解下Selenium基於CORE/IDE的簡單應用。在開始前,我們先回顧下上篇文章中的內容:
  Selenium Core是Selenium的核心部分,它由一些純js代碼組成, 可以運行在windows/linux的不同browser上, 而IDE是在core的基礎上的一種應用, 通過UI實現類似QTP/Winner的腳本錄製回放功能。


  Core的運行模式主要有:
  1. Selenium IDE 運行
  利用IDE插件加載core引擎,運行測試腳本。主要用於腳本錄製調試,類似於開發工具的調試,一般不應用於測試。
  2. 部署於被測對象服務器上,以http方式運行
  將core核心引擎和測試代碼部署與被測對象的Web服務器上,以http請求的方式運行。
  3. 本地模式HTA and Chrome
  HTA模式是在IE下運行,Chrome是在Firefox下運行。這個兩個的原理都是利用瀏覽器的本地化模式,調用主html文件--Test Runner 加載核心引擎庫,執行test suite裏的測試用例。


  Selenium IDE說明:
  Selenium IDE是通過監聽用戶對html頁面的操作來錄製腳本的,是真正能夠監聽用戶對html頁面的操作的錄製工具。 Selenium IDE可以生成7種語言的腳本:html,java,C#,ruby,python,perl,php。
  你可以直接在FireFox中將Selenium IDE打開,執行html格式的腳本。 
  如果你要執行其他語言格式的Selenium腳本,那麼,你需要使用Selenium服務器,使用RC模式。6種語言的使用方法都是一樣的。

  在簡單的回顧了上篇文章的內容後,讓我們開始進入實踐環節,自動化測試的關鍵,當然是要有測試腳本,Selenium core的測試腳本是html格式的,如過你很熟悉的話,可以自己手工編寫測試腳本。當然,Selenium core也提供了腳本錄製的工具—Selenium IDE。下面,我們就從腳本錄製開始,使用Selenium core完成一個簡單的測試腳本。


  一、 準備工作:
  1. Mozilla Firefox
  下載地址:
  http://www.mozillaonline.com/
  安裝後設置:
  屏蔽‘阻止彈出窗口
 

  2. Selenium IDE
  下載地址:
  http://release.openqa.org/selenium-ide/1.0-beta-2/selenium-ide-1.0-beta-2.xpi
  安裝:
  利用FireFox打開這個文件或者直接在FireFox中打開IDE鏈接後安裝。
  重新啓動FireFox,打開‘工具’ 菜單,點擊 Selenium IDE 後即可彈出IDE窗口。

  3. Selenium Core
  下載地址:
  http://release.seleniumhq.org/selenium-core/1.0-beta-2/selenium-core-1.0-beta-2.zip
  4. UltraEdit
  推薦安裝,用於編輯修改html運行腳本。

  二、 錄製腳本
  準備工作做好後,讓我們使用IDE來錄製腳本。啓動Firefox瀏覽器,在Firefox菜單欄中單擊“工具”菜單,我們會看到Selenium IDE是其子菜單:



 
  單擊Selenium IDE項我們可以看到彈出Selenium IDE窗口:   


  然後我們就可以使用Selenium IDE進行錄製了。切換的Firefox 瀏覽器,在地址欄輸入www.google.cn,訪問google。流程爲:打開Google首頁->在google搜索框中輸入“Google 黑板報”->左鍵單擊“google 搜索”按鈕->在新頁面選中“Google 中國的博客網誌”,鼠標單擊右鍵,在下列列表中選擇verifyTextPresent項以驗證搜索成功。如下圖:
 

  回到IDE界面,單擊錄製按鈕停止錄製。然後就可以單擊播放按鈕播放我們剛錄製的腳本了,如下圖:
 

  點擊Source標籤,我們可以看到如下的html格式腳本:
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">New Test</td></tr>
</thead><tbody>
<tr>
 <td>open</td>
 <td>/</td>
 <td></td>
</tr>
<tr>
 <td>type</td>
 <td>q</td>
 <td>Google 黑板報</td>
</tr>
<tr>
 <td>clickAndWait</td>
 <td>btnG</td>
 <td></td>
</tr>
<tr>
 <td>verifyTextPresent</td>
 <td>Google 中國的博客網誌</td>
 <td></td>
</tr>
</tbody></table>
 

  如果你瞭解html,你就會看到,Selenium core的腳步命令式以table的格式編寫的,一行(<tr>*</tr>)代表一個步驟。每行的第一列(<td>*</td>),是Command 或者 Action,指示Selenium要幹什麼。第二列是被操作目標,如要點擊的button id,要輸入的text id等。第三列是該動作(Command or action)需要的參數。如上面的html腳本在瀏覽器顯示如下:

New Test
open /  
type q Google 黑板報
clickAndWait btnG  
verifyTextPresent Google 中國的博客網誌  

 
  第一行的作用是open一個url, 因爲在Selenium IDE裏自動指定了baseURL,所以這裏的被操作對象是一個”/”, 代表打開baseURL。如下圖:
 

  因此,在編寫腳本時,要注意給baseURL賦值,或者直接指定url。
  第二行type命令,向id 是q的文本框輸入“Google 黑板報”。
  第三行clickAndWait命令,單擊id是btnG的button,並等待頁面提交成功。
  第四行verifyTextPresent命令,在頁面上驗證有沒有“Google 中國的博客網誌”的文本。

  另外需要說明的是,我們可以使用Selenium的菜單欄“Options”菜單中的“Format”子菜單將腳本轉化爲各自所需的語言類型。

  三、 編輯部署腳本
  在上次我們介紹了詳細的Selenium Core腳本的錄製與回放。在腳本編寫好後,我們如何部署我們的腳步呢?這裏有一個關鍵的概念—Test Suite,即,一些test case的集合。
  你可以在Selenium core的tests目錄下找到這個文件:TestSuite.html, 如下:
Test Suite
TestUseXpathLibrary
TestMouseEvents

 

  我們只要將Test Suite的連接,指向我們的test case就可以了。一個Test Suite,可以指向N個Test case。下面,我們就詳細介紹各個步驟。
  1. 將我們編寫好後的腳本保存在磁盤上。假定我們將其存放在D:\Selenium\TestCase目錄下。文件名爲testGoogle.html
  2. 將Selenium Core包裏的core目錄解壓到D:\Selenium目錄下。Selenium目錄的結構如下:
  D:\Selenium
           Core
           TestCase
  3. 拷貝TestSuite.html到Test Case目錄下,修改連接指向我們的Test case。
Test Suite
Test Google

 

  這樣,我們的腳本和Test Suite就準備好了,當然,這只是我們的學習用例,真正的測試基本的部署,需要考慮腳本的架構、模塊的劃分、後續的維護等等方面,在後續,我們有專門的章節來討論。本章只是簡單部署下,瞭解爲主。

  四、 本地模式運行測試腳本
  在上次,我們簡單介紹了Selenium的運行模式,我們的測試腳本和Test Suite已經完成,下面我們分別用三種模式,來運行我們的Test case。
  1. HTA模式運行
  HTA是HTML Application的縮寫(HTML應用程序),直接將HTML保存成HTA的格式,就是一個獨立的應用軟件,這種模式可以讓你避開瀏覽器安全的限制。當你需要在客戶端創建被腳本標記爲不安全的組件時,它就很有用處了;因此,用這種模式,可以避開安全錯誤以及一些錯誤彈出窗口。
因此,Selenium core模式下,我們可以直接通過hta模式來運行我們的測試腳本,具體步驟如下:
  1.1 運行D:\Selenium\core目錄下的TestRunner.hta,如下圖
 

  1.2 在Test Suite輸入框裏,輸入Test Suite的地址,如下圖:
 

  這裏的地址是html的相對地址,當然,你也可以輸入絕對地址,但不推薦這樣做。
然後點擊按鈕“go”,就轉到TestSuite頁面了。
  1.3 右側操作欄有4個按鈕,從左到右分別是“執行全部case、執行選中case、暫停和按步驟執行”,點擊“執行全部case”,我們的測試用例就會被執行。
  2. Chrome模式運行
  在Mozilla下,通過Mozilla的chrome系統,安裝於Mozilla的插件包可以用特殊的chrome URL關聯訪問。Chrome的全稱是統一資源定位器。插件包安裝過之後具有不受安全限制的優點,因此,和基於IE的hta模式具有同樣優點,可以解決web測試中的跨站及安全限制問題。
  用Chrome運行Selenium Core的步驟如下:
  2.1 前提條件:安裝了Mozilla Firefox,Mozilla Firefox安裝了Selenium ide的插件包。
  2.2 打開Firefox,輸入如下url:
  chrome://selenium-ide/content/selenium/TestRunner.html?test=file:///D:/selenium/TestCase/TestSuite.html&userExtensionsURL=&baseURL=http://www.google.cn
  上面的url,第一處紅色的部分是指定Test Suite的本地地址 ,第二處紅色的部分,是指定本次測試的baseURL。
  2.3 運行後,出現TestRunner頁面,具體操作與1同。
  3. 部署在被測目標服務器上
  將Selenium core 和 測試用例與被測對象部署在同一個web服務器上,訪問core目錄下的TestRunner.html來測試被測對象。TestRunner.html和TestRunner.hta的界面操作相同。

  五、 附Selenium Core命令指南

  參考地址:http://release.seleniumhq.org/selenium-core/1.0/reference.html

一、  Commands (命令)

Action
對當前狀態進行操作
失敗時,停止測試
Assertion
校驗是否有產生正確的值
Element Locators
指定HTML中的某元素
Patterns
用於模式匹配
1. Element Locators (元素定位器)

id=id
id locator 指定HTML中的唯一id的元素 
 name=name
name locator指定 HTML中相同name的元素中的第一個元素
 identifier=id
identifier locator 首先查找HTML是否存在該id的元素, 若不存在,查找第一個該name的元素 
dom=javascriptExpression
dom locator用JavaScript表達式來定位HTML中的元素,注意必須要以"document"開頭
例如:
dom=document.forms['myForm'].myDropdown
dom=document.images[56]
 xpath=xpathExpression
xpath locator用 XPath 表達式來定位HTML中的元素,必須注意要以"//"開頭
例如:
xpath=//img[@alt='The image alt text']
xpath=//table[@id='table1']//tr[4]/td[2]
 link=textPattern
link locator 用link來選擇HTML中的連接或錨元素
例如:
link=The link text
在沒有locator前序的情況下 Without a locator prefix, Selenium uses:
如果以"document."開頭,則默認是使用 dom locator,如果是以"//"開頭,則默認使用xpath locator,其餘情況均認作identifier locator
2. String Matching Patterns (字符串匹配模式)

glob:patthern
glob模式,用通配符"*"代表任意長度字符,"?"代表一個字符
regexp:regexp
正則表達式模式,用JavaScript正則表達式的形式匹配字符串
exact:string
精確匹配模式,精確匹配整個字符串,不能用通配符
在沒有指定字符串匹配前序的時候,selenium 默認使用golb 匹配模式
3. Select Option Specifiers (Select選項指定器)

label=labelPattern
通過匹配選項中的文本指定選項
例如:label=regexp:^[Oo]ther
value=valuePattern
通過匹配選項中的值指定選項
例如:value=other
id=id
通過匹配選項的id指定選項
例如: id=option1
index=index
通過匹配選項的序號指定選項,序號從0開始
例如:index=2
在沒有選項選擇前序的情況下,默認是匹配選項的文本
二、 Actions
描述了用戶所會作出的操作。
Action 有兩種形式: action和actionAndWait, action會立即執行,而actionAndWait會假設需要較長時間才能得到該action的相響,而作出等待,open則是會自動處理等待時間。

click
click(elementLocator)
- 點擊連接,按鈕,複選和單選框
- 如果點擊後需要等待響應,則用"clickAndWait"
- 如果是需要經過JavaScript的alert或confirm對話框後才能繼續操作,則需要調用verify或assert來告訴Selenium你期望對對話框進行什麼操作。 click  aCheckbox   
clickAndWait  submitButton   
clickAndWait  anyLink   

open
open(url)
- 在瀏覽器中打開URL,可以接受相對和絕對路徑兩種形式
- 注意:該URL必須在與瀏覽器相同的安全限定範圍之內 open  /mypage   
open  http://localhost/   

type
 type(inputLocator, value)
- 模擬人手的輸入過程,往指定的input中輸入值
- 也適合給複選和單選框賦值
- 在這個例子中,則只是給鉤選了的複選框賦值,注意,而不是改寫其文本 type  nameField  John Smith 
typeAndWait  textBoxThatSubmitsOnChange  newValue 

select
select(dropDownLocator, optionSpecifier)
- 根據optionSpecifier選項選擇器來選擇一個下拉菜單選項
- 如果有多於一個選擇器的時候,如在用通配符模式,如"f*b*",或者超過一個選項有相同的文本或值,則會選擇第一個匹配到的值 select   dropDown  Australian Dollars 
select   dropDown  index=0 
selectAndWait  currencySelector  value=AUD 
selectAndWait  currencySelector  label=Auslian D*rs 

 goBack,close
goBack()
模擬點擊瀏覽器的後退按鈕
close()
模擬點擊瀏覽器關閉按鈕
selectWindow
select(windowId)
- 選擇一個彈出窗口
- 當選中那個窗口的時候,所有的命令將會轉移到那窗口中執行 selectWindow  myPopupWindow   
selectWindow  null   

pause
pause(millisenconds)
- 根據指定時間暫停Selenium腳本執行
- 常用在調試腳本或等待服務器段響應時 pause  5000   
pause  2000   

fireEvent
 fireEvent(elementLocatore,evenName)
模擬頁面元素事件被激活的處理動作 fireEvent  textField  focus 
fireEvent  dropDown  blur 

waitForCondition
waitForCondition(JavaScriptSnippet,time)
- 在限定時間內,等待一段JavaScript代碼返回true值,超時則停止等待 waitForCondition  var value=selenium.getText("foo"); value.match(/bar/);  3000 

waitForValue
waitForValue(inputLocator, value)
- 等待某input(如hidden input)被賦予某值,
- 會輪流檢測該值,所以要注意如果該值長時間一直不賦予該input該值的話,可能會導致阻塞 waitForValue  finishIndication  isfinished 
     

store,stroreValue
store(valueToStore, variablename)
保存一個值到變量裏。
該值可以由自其他變量組合而成或通過JavaScript表達式賦值給變量 store  Mr John Smith  fullname 
store  $.{title} $.{firstname} $.{suname}  fullname 
store  javascript.{Math.round(Math.PI*100)/100}  PI 
storeValue  inputLocator  variableName 

把指定的input中的值保存到變量中

storeValue  userName  userID 
type  userName  $.{userID} 

storeText, storeAttribute
storeText(elementLocator, variablename)
把指定元素的文本值賦予給變量 storeText  currentDate  expectedStartDate 
verifyValue  startDate  $.{expectedStartDate} 

storeAttribute(.{}elementLocator@attributeName,variableName.{})
把指定元素的屬性的值賦予給變量

storeAttribute  input1@class   classOfInput1 
verifyAttribute  input2@class  $.{classOfInput1} 

chooseCancel.., answer..
chooseCancelOnNextConfirmation()
- 當下次JavaScript彈出confirm對話框的時候,讓selenium選擇Cancel
- 如果沒有該命令時,遇到confirm對話框Selenium默認返回true,如手動選擇OK按鈕一樣 chooseCancelOnNextConfirmation      

- 如果已經運行過該命令,當下一次又有confirm對話框出現時,也會同樣地再次選擇Cancel
answerOnNextPrompt(answerString)
- 在下次JavaScript彈出prompt提示框時,賦予其anweerString的值,並選擇確定

answerOnNextPrompt  Kangaroo   

三、 Assertions
允許用戶去檢查當前狀態。兩種模式: Assert 和 Verify, 當Assert失敗,則退出測試;當Verify失敗,測試會繼續運行。

assertLocation, assertTitle
assertLocation(relativeLocation)
判斷當前是在正確的頁面 verifyLocation  /mypage   
assertLocation  /mypage   

assertTitle(titlePattern)
檢查當前頁面的title是否正確 verifyTitle  My Page   
assertTitle  My Page   

assertValue
assertValue(inputLocator, valuePattern)
- 檢查input的值
- 對於 checkbox或radio,如果已選擇,則值爲"on",反之爲"off" verifyValue  nameField  John Smith 
assertValue  document.forms[2].nameField  John Smith 

assertSelected, assertSelectedOptions
assertSelected(selectLocator, optionSpecifier)
檢查select的下拉菜單中選中的選型是否和optionSpecifer(Select選擇選項器)的選項相同 verifySelected  dropdown2  John Smith 
verifySelected  dorpdown2  value=js*123 
assertSelected  document.forms[2].dropDown  label=J*Smith 
assertSelected  document.forms[2].dropDown  index=0 

assertSelectOptions(selectLocator, optionLabelList)
- 檢查下拉菜單中的選項的文本是否和optionLabelList相同
- optionLabelList是以逗號分割的一個字符串 verifySelectOptions  dropdown2  John Smith,Dave Bird 
assertSelectOptions  document.forms[2].dropdown  Smith,J,Bird,D 

assertText
assertText(elementLocator,textPattern)
- 檢查指定元素的文本
- 只對有包含文本的元素生效
- 對於Mozilla類型的瀏覽器,用textContent取元素的文本,對於IE類型的瀏覽器,用innerText取元素文本 verifyText  statusMessage  Successful 
assertText  //div[@id='foo']//h1  Successful 

assertTextPresent, assertAttribute
assertTextPresent(text)
檢查在當前給用戶顯示的頁面上是否有出現指定的文本 verifyTextPresent  You are now logged in   
assertTextPresent  You are now logged in   

assertAttribute(.{}elementLocator@attributeName.{}, ValuePattern)
檢查當前指定元素的屬性的值 verifyAttribute  txt1@class  bigAndBlod 
assertAttribute  document.images[0]@alt  alt-text 
verifyAttribute  //img[@id='foo']/alt  alt-text 

assertTextPresent, etc.
assertTextPresent(text)
assertTextNotPresent(text)
assertElementPresent(elementLocator)  verifyElementPresent    submitButton     
 assertElementPresent    //img[@alt='foo']      assertElementNotPresent(elementLocator) 

assertTable
assertTable(cellAddress, valuePattern)
- 檢查table裏的某個cell中的值
- cellAddress的語法是tableName.row.column, 注意行列序號都是從0開始 verifyTable  myTable.1.6  Submitted 
assertTable  results0.2  13 

assertVisible, nonVisible
assertVisible(elementLocator)
- 檢查指定的元素是否可視的
- 隱藏一個元素可以用設置css的'visibility'屬性爲'hidden',也可以設置'display'屬性爲'none' verfyVisible  postcode   
assertVisible  postcode   

assertNotVisible(elementLocator)  verfyNotVisible    postcode     
 assertNotVisible    postcode     

Editable, non-editable
assertEditable(inputLocator)
檢查指定的input是否可以編輯 verifyEditable  shape   
assertEditable  colour   

assertNotEditable(inputLocator)
檢查指定的input是否不可以編輯
assertAlert
assertAlert(messagePattern)
- 檢查JavaScript是否有產生帶指定message的alert對話框
- alert產生的順序必須與檢查的順序一致
- 檢查alert時會產生與手動點擊'OK'按鈕一樣的效果。如果一個alert產生了,而你卻沒有去檢查它,selenium會在下個action中報錯。
- 注意:Selenium 不支持 JavaScript 在onload()事件時 調用alert();在這種情況下,Selenium需要你自己手動來點擊OK.
assertConfirmation
assertConfirmation(messagePattern)
- 檢查JavaScript是否有產生帶指定message的confirmation對話框和alert情況一樣,confirmation對話框也必須在它們產生的時候進行檢查
- 默認情況下,Selenium會讓confirm() 返回true, 相當於手動點擊Ok按鈕的效果。你能夠通過chooseCancelOnNextConfirmation命令讓confirm()返回false.同樣地,如果一個cofirmation對話框出現了,但你卻沒有檢查的話,Selenium將會在下個action中報錯
- 注意:在Selenium的環境下,confirmation對話框框將不會再出現彈出顯式對話框
- 注意:Selenium不支持在onload()事件時調用confirmation對話框,在這種情況下,會出現顯示confirmatioin對話框,並需要你自己手動點擊。
 assertPrompt
assertPrompt(messagePattern)
- 檢查JavaScript是否有產生帶指定message的Prompt對話框
- 你檢查的prompt的順序Prompt對話框產生的順序必須相同
- 必須在verifyPrompt之前調用answerOnNextPrompt命令
- 如果prompt對話框出現了但你卻沒有檢查,則Selenium會在下個action中報錯 answerOnNextPrompt  Joe   
click  id=delegate   
verifyPrompt  Delegate to who?   

四、 Parameters and Variables
參數和變量的聲明範圍由簡單的賦值到JavaScript表達式賦值。
Store,storeValue 和storeText 爲下次訪問保存值。
在Selenium內部是用一個叫storeVars的map來保存變量名。

Variable Substitution 變量替換
提供了一個簡單的方法去訪問變量,語法 $.{xxx} store  Mr  title 
storeValue  nameField  surname 
store  $.{title} $.{suname}  fullname 
type  textElement  Full name is: $.{fullname} 

 JavaScript Evaluation JavaScript賦值
你能用JavaScript來構建任何你所需要的值。
這個參數是以javascript開頭,語法是 javascript.{'with a trailing'}。
可以通過JavaScript表達式給某元素賦值。 store  javascript.{'merchant'+(new Date()).getTime()}  merchantId 
type  textElement  javascript.{storedVars['merchantId'].toUpperCase()} 

Generating Unique values 產生唯一值. 
問題:你需要唯一的用戶名
解決辦法: 基於時間來產生用戶名,如'fred'+(new Date().getTime())


來自CSDN博客:http://blog.csdn.net/iamqa/archive/2009/07/31/4398240.aspx

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