[Selenium] 基本使用

1. Selenium基礎


1.1 Selenium簡介

Selenium是一系列基於Web的自動化測試工具,它提供了一系列測試函數,用於支持Web自動化測試,它們能夠通過多種方式定位界面元素,並將預期結果與系統實際表現進行比較。Selenium具有以下幾個特性:

1) 可對多瀏覽器進行測試,如IE、Firefox、Safari、Chrome、手機瀏覽器等。

2) 支持多種語言,如Java、C#、Python、Ruby、PHP等。

3) 跨平臺,如Windows、Linux、IOS、Android等。

4) 開源免費。


1.2 Selenium工具組

Selenium由以下幾個工具組成:

1) Selenium IDE

Selenium IDE是一個用於構建腳本的初級工具,它是一個Firefox插件,擁有一個易於使用的界面,擁有錄製功能記錄用戶操作並導出爲可重複使用的腳本。

2) Selenium 1

Selenium 1(Selenium RC)是Selenium最主要的測試工具之一,它能夠通過多種語言編寫測試代碼,同時能支持幾乎所有瀏覽器的測試。

3) Selenium 2

Selenium 2(WebDriver)作爲最新版的工具,代表未來Selenium的發展方向,這套全新的自動化測試工具提供了許多功能,包括一套組織性更好、面向對象的API,並克服了在Selenium 1版本中測試的侷限性。

4) Selenium Grid

Selenium Grid能夠讓Selenium 1的測試在多個不同的環境中運行,也能讓測試並行執行。也就是說,各個測試能夠在同一時間、不同機器上運行。


2. Selenium IDE


2.1 安裝IDE

Selenium IDE可以從http://seleniumhq.org/download/下載,如果當前使用的瀏覽器是Firefox,Firefox會自動將其識別爲Firefox附加組件下載,下載結束後,提示安裝組件,如下所示:

wKiom1UIFYjxSJllAAHk_iWMw3g983.jpg

安裝結束後,重啓瀏覽器,就可以在菜單中看到Selenium IDE項。


2.2 錄製測試用例

打開Selenium IDE,默認開啓錄製,可以單擊紅色圓形按鈕取消錄製,如下所示:

wKiom1UOp9myUwZDAAGx6RMlGGo099.jpg

新建用例需要用到“文件”菜單 ,菜單中出現最多的是Test Case和Test Suite。通常,一組相關的Test Case就是一個Test Suite,即一個測試套件由多個測試用例串連組成。在打開Selenium IDE時,IDE已經默認建立了一個名爲"Untitled"的測試套件。

以錄製百度搜索的動作爲例,首先在Base URL中輸入百度的地址,然後單擊錄製按鈕,接着在Firefox中打開百度主頁,輸入搜索關鍵字"selenium",單擊“百度一下”,返回Selenium IDE並停止錄製,可以看到Test Suite中測試步驟表格中添加了幾行新數據,如下所示:

wKiom1UOqT-yE3mfAAJfCpC1kZo415.jpg

測試步驟表格使用的關鍵字驅動的測試方式,包含以下3欄:

1) Command: 表示要執行的操作是什麼。

2) Target: 表示要操作的界面元素是哪個。

3) Value: 表示操作時使用的值是多少。

在上圖中,第一行對目標"/"使用Open命令以打開網頁,第二行找到id爲kw的元素,然後使用Type命令輸入內容,輸入的值爲selenium,第三行找到id爲su的元素,然後執行clickAndWait命令,先執行單擊,然後等待頁面加載完畢。只需單擊操作欄中的播放按鈕即可重複執行該測試,使用Fast-Slow滑動條可以控制測試中每個步驟執行的時間間隔。


2.3 編寫測試用例

瞭解了錄製的原理後,可以直接通過編寫測試步驟表格的方式來編寫用例,現在使用Google測試。

在操作步驟表上單擊鼠標右鍵,選擇Insert New Command選項,接着進行編輯操作,輸入open命令,將Target設置爲"http://www.google.com.hk"。接着插入新行,在Command文本框中輸入type,在Target文本框中輸入id=lst-ib,輸入的值爲selenium。再插入第3個步驟,編輯click命令,讓其單擊搜索按鈕,如下所示:

wKiom1UOrHfTHikyAAKCD0i7y5U449.jpg


3. Command


3.1 命令集

Command表示要執行的操作是什麼,是必需的參數,單擊Command下拉列表框,可以看到所有的命令。這些Selenium命令通常稱爲"selenese",它是一套用於執行測試的命令集,這些命令組合起來就構成了測試腳本。

在selenese中,一部分命令基於HTML標記,用於測試UI元素是否存在、驗證指定內容是否正確、檢查鏈接是否可用,並可以輸入字段、選擇列表的選項、提交表單並操作表格中的數據。而另一部分Selenium命令用於輔助測試,例如驗證窗口大小、鼠標位置、警告信息、Ajax功能、彈出窗口、事件處理以及其他各種Web應用程序功能,如下所示:

wKiom1URWOyQS2XFAAIfKMQ_2Qg640.jpg

Selenium命令可以分爲3類:Action(操作)、Accessor(存儲)以及Assertion(斷言)。Action命令一般用於操作應用程序的狀態。Accessor命令用於檢查應用程序的狀態,並將結果存儲在變量中。Assertion命令類似Accessor命令,但它們會驗證應用程序的狀態,並確認這些狀態符合預期結果。


3.2 瀏覽器操作

Action命令一般用於操作應用程序,它們的作用就是執行操作,例如“單擊”、“選擇”、“輸入”等。Action命令運行失敗或出現錯誤,將會使測試中斷執行。有些帶"...AndWait"後綴的命令,相當於在原命令後面加了一個“waitForPageToLoad”命令,即在某個操作執行後,等待頁面刷新完畢,也可以用原命令加上"waitForPageToLoad"的方式。

1) open(url): 打開指定的URL,可以爲相對URL或絕對URL。open命令將等待頁面加載完畢再執行下一個命令。在IDE中使用open時,如果參數Target爲空,將打開BaseURL中的填寫的頁面,當Target不爲空時,將打開BaseURL+Target頁面,當Target以http://開頭時,將忽略BaseURL,直接打開Target中的網址。

2) goBack(): 該命令相當於單擊瀏覽器上的後退按鈕,由於沒有參數,Target和Value可以不填。

3) refresh(): 該命令相當於單擊瀏覽器上的刷新按鈕,由於沒有參數,Target和Value可以不填。

4) windowFocus(): 該命令用於激活當前選中的瀏覽器窗口,由於沒有參數,Target和Value可以不填。

5) windowMaximize(): 該命令用於將當前選中的瀏覽器窗口最大化,由於沒有參數,Target和Value可以不填。

6) close(): 該命令用於關閉當前選中的瀏覽器窗口,由於沒有參數,Target和Value可以不填。


3.3 基本操作

1) type(locator, value) : 該命令用於在input類型的元素中輸入值,就像是在用鍵盤輸入。它也可以用於給下拉列表框、複選框賦值。

2) typeKeys(locator, value) : 該命令用於模擬鍵盤敲擊事件,逐個輸入字符。相當於調用了keyDown、keyUp、keyPress等事件。

3) click(locator) :  單擊鏈接、複選框或單選框。

4) clickAt(locator, coordString) : 與click命令類似,但需要填寫相對座標。

5) doubleClick(locator) :  雙擊鏈接、複選框或單選框。

6) doubleClickAt(locator, coordString) : 與doubleClick類似,區別在於需要填寫相對座標。

7) select(selectLocator, optionLocator) : 該命令用於在下拉列表框中選擇指定選項。選項的定位方式和下拉框的定位方式有所不同,"label="基於選項的文本進行匹配,"value="基於選項的真實值進行匹配,"id="基於選項的id進行匹配,"index="基於選項的索引進行匹配。如果沒有帶前綴,默認以label方式匹配。

8) check(locator) : 勾選複選框或單選框,注意check命令不會觸發單擊動作。

9) uncheck(locator) : 與check命令的功能相反,其作用爲取消勾選。

10) focus(locator) : 將焦點轉移到指定的元素上。

除了以上操作,Selenium IDE還提供了一些用於模擬鍵盤鼠標操作的命令,如下所示:

名稱
作用
altKeyDown()摸擬按下Alt鍵不放,直到調用altKeyUp命令
altKeyUp()鬆開Alt鍵
controlKeyDown()模擬按下Ctrl鍵不放,直到調用controlKeyUp命令
controlKeyUp()
鬆開Ctrl鍵
shiftKeyDown()模擬按下Shift鍵不放,直到調用shiftKeyUp命令
shiftKeyUp()鬆開Shift鍵
keyDown(locator, keySequence)模擬按下某個鍵不放,直到執行keyUp命令
keyPress(locator, keySequence)模擬用戶敲擊了某個按鍵
keyUp(locator, KeySequence)模擬鬆開某個鍵
mouseDown(locator)模擬用戶在指定元素上按下鼠標左鍵不放
mouseDownAt(locator, coordString)和mouseDown類似,需要填寫座標
mouseDownRight(locator)模擬用戶在指定元素上按下鼠標右鍵不放
mouseDownRightAt(locator, coordString)和mouseDownRight類似,需要填寫座標
mouseUp(locator)鬆開按下的鼠標左鍵
mouseUpAt(locator, coordString)和mouseUp類似,需要填寫座標
mouseUpRight(locator)鬆開按下的鼠標右鍵
mouseUpRightAt(locator, coordString)和mouseUpRight類似,需要填寫座標
mouseOver(locator)將鼠標光標移動到指定元素內
mouseOut(locator)將鼠標光標移動到指定元素外


3.4 設置和控制類操作

1) setTimeout(timeout) : 指定Selenium在執行某一操作時的最大等待時間,僅適用於open命令、以waitFor開頭的命令以及帶有AndWait後綴的命令。默認超時時間是30秒,如果測試超過30秒,那麼將拋出錯誤。

2) setSpeed(value) : 設置測試的執行速度,即各個測試步驟之間執行的時間間隔。默認是沒有間隔的,間隔時間爲0秒。

3) pause(waitTime) : 使測試在指定時間內暫停執行。

4) break() : 暫停正在執行的測試,直到用戶手動單擊繼續按鈕。

5) captureEntirePageScreenshot(filename, kwargs) : 將當前窗口進行截圖並保存爲PNG文件。

6) highlight(locator) : 暫時將指定元素的背景色改爲***,並在稍後取消該效果。

7) echo(message) : 將指定信息打印出來,一般用於調試。


3.5 Accessor

Accessor命令用於檢查應用程序的狀態,並將結果存儲在變量中。Accessor命令可用於自動生成Assertion命令,其中變量的值可以用"${name}"來讀取。

1) store(expression, variableName) : 這是最基本的存儲方式,將指定的值存儲在變量中。

2) storeTitle(variableName) : 用於存放當前網頁的標題。

3) storeLocation(variableName) : 用於存儲當前網頁的URL。

4) storeValue(locator, variableName) : 用於存儲input元素所存放的值,例如文本框、複選框、單選框中的值。對於複選框或單選框,存放的值會變成"on"或"off"。

5) storeEditable(locator, variableName) : 用於存儲input元素的可編輯狀態,例如文本框、複選框、單選框的可編輯狀態,如果可以編輯,則返回true,否則返回false。

6) storeText(Locator, variableName) : 用於存儲某個元素的文本值,例如鏈接,純文本等。

7) storeChecked(locator, variableName) : 存儲複選框或單選框的勾選情況,返回值爲true或false。

8) storeSelectedIndex(selectLocator, variableName) : 獲取所選項在例 表中的索引(從0開始)。

9) storeSelectedLabel(selectLocator, variableName) : 獲取指定列表中所選項的文本值。

10) storeSelectedValue(selectLocator, variableName) : 獲取指定列表中所選項的真實值。

11) storeSelectOptions(selectLocator, variableName) : 獲取指定列表中所有選項的文本,以逗號分隔。

12) storeTable(tableCellAddress, variableName) : 獲取表格中某個單元格的值,行號和列號都從0開始。

13) storeAttribute(attributeLocator, variableName) : 獲取指定屬性的值,注意Target應填寫屬性的定位表達式。

14) storeTextPresent(pattren, variableName) : 驗證指定的文本是否在頁面中出現,如果是則返回true,否則返回false。

15) storeElementPresent(locator, variableName) : 驗證指定元素是否存在於頁面中,如果是則返回true,否則返回false。

16) storeVisible(locator, variableName) : 驗證指定元素是否存在於頁面中,特別是visibility屬性爲hidden或display屬性爲none的不可見元素。

17) storeSpeed(variableName) : 獲取執行速度,該命令將獲取個測試步驟之間的執行間隔時間。


3.6 Assertion

Assertion命令與Accessor命令類似,但它們主要用於驗證某個命題是否爲真,例如“某元素是否存在”。所有的Assertion命令都可以通過3種模式使用:assert、verify和waitFor,例如assertText、verifyText和waitForText。如果assert失敗,測試會中斷,而verify失敗時,失敗將記錄下來,但測試依然會繼續執行,建議用單個assert來確認當前應用程序是否位於正確的頁面,然後使用一系列verify命令來測試表單字段的值、標籤值等。waitFor命令用於執行等待,直到等待的條件爲真,但如果等待時間超過當前的超時時間設置,等待的條件仍然爲假,那麼測試就會失敗並終止。

1) assertTitle(pattern) / assertNotTitle(pattern) / verifyTitle(pattern) / verifyNotTitle(pattern) / waitForTitle(pattern) / waitForNotTitle(pattern) : 驗證網頁的標題是否等於或不等於預期值。

2) assertLocation(pattern) / assertNotLocation(pattern) / verifyLocation(pattern) / verifyNotLocation(pattern) / waitForLocation(pattern) / waitForNotLocation(pattern) : 驗證網頁的URL是否等於或不等於預期值。

3) assertValue(locator, pattern) / assertNotValue(locator, pattern) / verifyValue(locator, pattern) / verifyNotValue(locator, pattern) / waitForValue(locator, pattern) / waitForNotValue(locator, pattern) : 驗證input元素的值是否等於或不等於預期值。

4) assertEditable(locator) / assertNotEditable(locator) / verifyEditable(locator) / verifyNotEditable(locator) / waitForEditable(locator) / waitForNotEditable(locator) : 驗證input元素的可編輯狀態是否爲預期狀態。

5) assertText(locator, pattern) / assertNotTitle(locator, pattern) / verifyTitle(locator, pattern) / verifyNotTitle(locator, pattern) / waitForTitle(locator, pattern) / waitForNotTitle(locator, pattern) : 驗證網頁的標題是否等於或不等於預期值。

6) assertChecked(locator) / assertNotChecked(locator) / verifyChecked(locator) / verifyNotChecked(locator) / waitForChecked(locator) / waitForNotChecked(locator) : 驗證複選框或單選框的勾選情況是否符合預期。

7) assertSelectedIndex(selectLocator, pattern) / assertNotSelectedIndex(selectLocator, pattern) / verifySelectedIndex(selectLocator, pattern) / verifyNotSelectedIndex(selectLocator, pattern) / waitForSelectedIndex(selectLocator, pattern) / waitForNotSelectedIndex(selectLocator, pattern) : 驗證所選項在列表中的索引是否符合預期值。

8) assertSelectedLabel(selectLocator, pattern) / assertNotSelectedLabel(selectLocator, pattern) / verifySelectedLabel(selectLocator, pattern) / verifyNotSelectedLabel(selectLocator, pattern) / waitForSelectedLabel(selectLocator, pattern) / waitForNotSelectedLabel(selectLocator, pattern) : 驗證指定列表中所選項的文本值是否符合預期值。

9) assertSelectedValue(selectorLocator, pattern) / assertNotSelectedValue(selectorLocator, pattern) / verifySelectedValue(selectorLocator, pattern) / verifyNotSelectedValue(selectorLocator, pattern) / waitForSelectedValue(selectorLocator, pattern) / waitForNotSelectedValue(selectorLocator, pattern) : 驗證指定列表中所選項的真實值是否符合預期值。

10) assertSelectOptions(selectLocator, pattern) / assertNotSelectOptions(selectLocator, pattern) / verifySelectOptions(selectLocator, pattern) / verifyNotSelectOptions(selectLocator, pattern) / waitForSelectOptions(selectLocator, pattern) / waitForNotSelectOptions(selectLocator, pattern) : 驗證指定列表中所有選項的文本是否符合預期值。

11) assertTable(tableCellAddress, pattern) / assertNotTable(tableCellAddress, pattern) / verifyTable(tableCellAddress, pattern) / verifyNotTable(tableCellAddress, pattern) / waitForTable(tableCellAddress, pattern) / waitForNotTable(tableCellAddress, pattern) : 驗證表格中某個單元格的值是否符合預期值。

12) assertAttribute(attributeLocator, pattern) / assertNotAttribute(attributeLocator, pattern) / verifyAttribute(attributeLocator, pattern) / verifyNotAttribute(attributeLocator, pattern) / waitForAttribute(attributeLocator, pattern) / waitForNotAttribute(attributeLocator, pattern) : 驗證指定屬性的值是否符合預期值。

13) assertTextPresent(pattern) / assertNotTextPresent(pattern) / verifyTextPresent(pattern) / verifyNotTextPresent(pattern) / waitForTextPresent(pattern) / waitForNotTextPresent(pattern) : 驗證指定的文本是否在頁面中出現。

14) assertElementPresent(locator) / assertNotElementPresent(locator) / verifyElementPresent(locator) / verifyNotElementPresent(locator) / waitForElementPresent(locator) / waitForNotElementPresent(locator) : 驗證指定元素是否存在於頁面上。

15) assertVisible(locator) / assertNotVisible(locator) / verifyVisible(locator) / verifyNotVisible(locator) / waitForVisible(locator) / waitForNotVisible(locator) : 驗證頁面中是否顯示指定元素。


4. Target和Value


4.1 identifier定位

對大多數Command來說,Target是必需的,主要用於識別Web頁面的元素,其格式爲“定位類型=定位值”。許多情況下,定位類型可以省略,而根據使用情景的不同,定位類型也有所不同。

identifier是一種最常用的元素定位方式,如果沒有定位類型,那麼它將是默認方式。如果使用這種定位方式,IDE會首先尋找首個id屬性等於定位值的頁面元素,如果沒有找到,就會尋找首個name屬性等於定位值的頁面元素,如果再沒有找到,定位就會失敗。


4.2 id和name定位

id和name定位比identifier定位方式更精細,更具體。如果已經知道某個元素的id或name,就可以使用這種方式。如果有多個元素的name屬性相同,那麼可以使用過濾器來進一步細化定位,默認的過濾器類型是value(也就是value屬性),比如"name=username value=admin"。


4.3 XPath定位

XPath表達式用於在XML文檔中定位節點,而HTML可以看做XML的一種實現。XPath定位比之前使用id或name屬性定位方式要豐富,但是更加依賴元素在頁面中的位置。


4.4 鏈接文字定位

通過鏈接文字定位,只需簡單提供鏈接文本就可以定位到對應的鏈接,如果有多個鏈接的文本相同,則會匹配第一個鏈接,比如"link=Click"。


4.5 DOM定位

DOM用於描述HTML文檔,可以通過JavaScript進行訪問。該定位方式需要JavaScript來計算出元素在頁面上的位置,通過分級符號"."可以輕鬆定位元素,比如"dom=document.getElementById('username')"。


4.6 CSS定位

CSS是一種描述HTML和XML文檔顯示方式的語言。CSS使用選擇器來爲文檔中的元素綁定樣式屬性,這些選擇器也可以用在Selenium中,作爲一種額外的定位方式,比如"css=#loginForm input:username"。


4.7 隱式定位

在遇到以下情況時,Target表達式中可以省略“定位類型=”的部分。

1) Target表達式沒有指定明確定位方式時,將默認使用identifier定位。

2) 如果Target表達式以"//"開頭,則會使用XPath定位。

3) 如果Target表達式以"document"開頭,則會使用DOM定位。


4.8 帶變量的字符串

Value除了純文本以外,還可以是帶變量的字符串或帶JavaScript的字符串。比如Value值由兩個變量組成:firstName和lastName,那麼可以使用"Full name is: $(firstName) $(lastName)"。


4.9 帶JavaScript的字符串

同上例,如果Value值仍然由firstName和lastName組成,並且需要把變量轉換爲大寫,那麼可以使用"javascript{Full name is: " + storedVars["firstName"].toUpperCase() + " " + storedVars["lastName"].toUpperCase()}


5. 日誌和導出 


5.1 日誌

在Selenium IDE界面上,還有一個包括Log、Reference、UI-Element、Rollup選項的對話框,如下所示:

wKiom1Ufq06zUsanAAA5N6nofkY303.jpg

其中最常用的是日誌和引用選項卡,日誌選項卡用於顯示執行測試時的信息,這些信息對調試將有幫助,單擊Info按鈕可以對日誌進行過濾,而單擊Clear按鈕將清楚所有的日誌。引用選項卡用於顯示當前所用命令的幫助文檔,例如在測試步驟選項卡中選擇type這個步驟,如下所示:

wKiom1UfrBTDfWfbAADYTmfsC5s669.jpg


5.2 命令導出

在測試步驟列表中,可以對某個命令進行復制,默認是複製爲HTML源碼,但也可以進行設置,將其複製爲其他類型的源碼,以便編碼時進行參考。只需在菜單中選擇"Options->ClipBoardFormat",然後選擇對應語言和Selenium版本即可,如下所示:

wKiom1UfrQ3jkbGJAANsgAJHfrU443.jpg

還可以將整個測試用例導出爲其他代碼,只需在菜單中選擇"文件->ExportTest Case As"或"文件->Export Test Suite As",然後選擇對應的語言及Selenium版本即可,如下所示:

wKiom1UfrgmAgFi2AANWW-1JVqM443.jpg



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