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附加組件下載,下載結束後,提示安裝組件,如下所示:
安裝結束後,重啓瀏覽器,就可以在菜單中看到Selenium IDE項。
2.2 錄製測試用例
打開Selenium IDE,默認開啓錄製,可以單擊紅色圓形按鈕取消錄製,如下所示:
新建用例需要用到“文件”菜單 ,菜單中出現最多的是Test Case和Test Suite。通常,一組相關的Test Case就是一個Test Suite,即一個測試套件由多個測試用例串連組成。在打開Selenium IDE時,IDE已經默認建立了一個名爲"Untitled"的測試套件。
以錄製百度搜索的動作爲例,首先在Base URL中輸入百度的地址,然後單擊錄製按鈕,接着在Firefox中打開百度主頁,輸入搜索關鍵字"selenium",單擊“百度一下”,返回Selenium IDE並停止錄製,可以看到Test Suite中測試步驟表格中添加了幾行新數據,如下所示:
測試步驟表格使用的關鍵字驅動的測試方式,包含以下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命令,讓其單擊搜索按鈕,如下所示:
3. Command
3.1 命令集
Command表示要執行的操作是什麼,是必需的參數,單擊Command下拉列表框,可以看到所有的命令。這些Selenium命令通常稱爲"selenese",它是一套用於執行測試的命令集,這些命令組合起來就構成了測試腳本。
在selenese中,一部分命令基於HTML標記,用於測試UI元素是否存在、驗證指定內容是否正確、檢查鏈接是否可用,並可以輸入字段、選擇列表的選項、提交表單並操作表格中的數據。而另一部分Selenium命令用於輔助測試,例如驗證窗口大小、鼠標位置、警告信息、Ajax功能、彈出窗口、事件處理以及其他各種Web應用程序功能,如下所示:
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選項的對話框,如下所示:
其中最常用的是日誌和引用選項卡,日誌選項卡用於顯示執行測試時的信息,這些信息對調試將有幫助,單擊Info按鈕可以對日誌進行過濾,而單擊Clear按鈕將清楚所有的日誌。引用選項卡用於顯示當前所用命令的幫助文檔,例如在測試步驟選項卡中選擇type這個步驟,如下所示:
5.2 命令導出
在測試步驟列表中,可以對某個命令進行復制,默認是複製爲HTML源碼,但也可以進行設置,將其複製爲其他類型的源碼,以便編碼時進行參考。只需在菜單中選擇"Options->ClipBoardFormat",然後選擇對應語言和Selenium版本即可,如下所示:
還可以將整個測試用例導出爲其他代碼,只需在菜單中選擇"文件->ExportTest Case As"或"文件->Export Test Suite As",然後選擇對應的語言及Selenium版本即可,如下所示: