昨天突然想學(xué)學(xué) Selenium筹燕,就上網(wǎng)查了一些介紹,發(fā)現(xiàn)一些教程基本都是比較老版本的了蛹含,使用起來略有不便毅厚,所以今天試著寫一些最新版本的。請參考Selenium官網(wǎng)浦箱。文章以下內(nèi)容都是在 Mac 機器上按照 Selenium-IDE官方文檔編寫吸耿,適用于當前最新版本。其實官方文檔寫的很好酷窥,圖文并茂咽安,可以試著研讀官方的。
這篇文章講的是 Selenium-IDE蓬推,不是 Selenium妆棒。
為什么這么說?請看下圖沸伏。
Selenium-IDE 只是一個錄制腳本的工具糕珊。僅僅作為入門使用。
目前 Selenium-IDE不僅支持FireFox毅糟,還支持 Chrome放接。本文以 FireFox 為例。
Selenium 添加過以后就出現(xiàn)在了瀏覽器菜單欄的最右側(cè)留特,如文章第一張圖Se 圖標纠脾。雙擊圖標打開 Selenium IDE,如下圖:
IDE 主要功能(IDE Features)
??工具欄(Toolbar)
工具欄最右側(cè)的紅色原點就是錄制按鈕蜕青。用來錄制用戶在瀏覽器上的操作腳本苟蹈。
速度控制:用來控制用例執(zhí)行速度
全部執(zhí)行:如果當前工程有多個測試用例,使用該按鈕就會將用例全部執(zhí)行
單個執(zhí)行:使用該按鈕只會自行當前選中的用例右核。如果當前工程只有一個用例慧脱,那么這個按鈕和“全部執(zhí)行”按鈕效果相同。
暫停/重新開始:可以用來暫秃睾龋或者重新開始一個正在執(zhí)行的用例菱鸥。
停止:停止當前正在執(zhí)行的用例宗兼。
逐步執(zhí)行:用來逐步逐步執(zhí)行一個用例。主要用來調(diào)試用例氮采。
錄制:用來錄制用戶在瀏覽器上的操作腳本殷绍。
??
??????測試用例面板(Test Case Panel)
錄制的腳本會顯示在這里
Command、Target和Value輸入字段顯示當前選擇的命令及其參數(shù)鹊漠。這些是可以修改當前選擇的命令的輸入字段主到。在底部窗格的Reference選項卡中指定用于命令的第一個參數(shù)總是位于Target字段中。如果第二個參數(shù)由Reference選項卡指定躯概,則它總是位于Value字段中登钥。注釋字段(Comment)允許您給當前命令添加注釋,方便日后閱讀娶靡。
備注:Reference 選項卡是一個很有用的功能牧牢,這里用來顯示當前選中 Command 的功能說明,包括該 Command 所需要的參數(shù)(不是所有的 Command 都必須具備 Target 和 Value 兩個值)姿锭,便于快速了解 Command 用法塔鳍。我查看了其他的文檔發(fā)現(xiàn)之前的版本是有的。現(xiàn)在被官方暫時隱藏了艾凯,不久的將來會再次開放献幔。
??
導(dǎo)航面版(Navigation Panel)
控制臺面板(Console Panel)
??Log
??當您運行測試用例時懂傀,顯示進度的錯誤消息和信息消息會自動顯示在這個窗格中趾诗,即使您不首先選擇Log選項卡。這些消息通常用于測試用例調(diào)試蹬蚁。注意清除日志的清除按鈕恃泪。
Reference
官網(wǎng)上介紹這個功能還在開發(fā)中,不久之后會更新(官網(wǎng)最近一次更新在2018-4-23)犀斋。
??
建立測試用例(Building Test Cases)
There are three primary methods for developing test cases. Frequently, a test developer will require all three techniques.
??
??錄制(Recording)
第一次使用 Selenium IDE 建議使用錄制功能贝乎,錄制按鈕默認是關(guān)閉的(之前的版本是默認打開),紅色原點表示錄制功能處于關(guān)閉狀態(tài)叽粹。
錄制過程中览效,Selenium-IDE會根據(jù)你在網(wǎng)頁上的操作動作自動在Test Case Panel填充腳本命令(commands),這些命令主要有以下類型:
- 點擊一個鏈接 - 一次點擊命令
- 輸入一個值 - 輸入命令
- 從下拉列表中選擇一個值 - 選擇命令
- 點擊復(fù)選框或者單選框(clicking checkboxes or radio buttons)- 點擊命令
菜鳥解釋第四條:復(fù)選框就是多選框,可以選中多個虫几;單選框就是各個選項是互斥的锤灿,只能選中一個。
以下是一些需要注意的“陷阱”:
- 輸入命令(type command)可能需要單擊web頁面的其他區(qū)域來記錄(record)辆脸。
??
??通過使用上下文菜單添加驗證和斷言但校。(Adding Verifications and Asserts With the Context Menu)
Your test cases will also need to check the properties of a web-page. This requires assert and verify commands. We won’t describe the specifics of these commands here; that is in the chapter on Selenium Commands – “Selenese”. Here we’ll simply describe how to add them to your test case.
如何添加斷言呢?在你錄制腳本的時候(紅色原點變成紅色正方形)啡氢,在頁面上的任何地方單擊鼠標右鍵状囱。您將看到一個顯示驗證和/或斷言命令的上下文菜單术裸。
第一次使用 Selenium-IDE 的時候可能不會有這么多選項,隨著使用次數(shù)的增多更多的命令會被自動添加到這個菜單中亭枷。
??
??編輯(Editing)
????插入命令(Insert Command)
在測試用例面板中(Test Case Panel) 選中您想要插入命令的測試用例中的命令(command)袭艺。左鍵單擊要插入新命令的行。右鍵單擊并選擇Insert命令;IDE將在您選擇的行前面添加一個空行∧唐埽現(xiàn)在使用命令編輯文本字段來輸入新命令及其參數(shù)匹表。
????插入評論(Insert Comment)
我們可以給每一條 command 添加評論,提高腳本可讀性宣鄙。
??
????Opening and Saving a Test Case
To save a Selenium IDE project, click the save button at the top right hand side, Selenium IDE will download a .side file, which contains all test cases and suites.
Selenium-IDE 保存的文件都是.side文件袍镀。
??
??運行測試用例(Running Test Cases)
在介紹 Toolbar 的時候已經(jīng)介紹了如何執(zhí)行測試用例,這里補充幾個:
- Stop in the Middle(打斷點)冻晤。
斷點的最大作用就是調(diào)試苇羡,能幫助最快找到問題所在點。比如下圖我們想要給第17行打斷點鼻弧,就選中改行设江,右鍵單擊,選擇 Toggle breakpoint攘轩。那么再執(zhí)行腳本的時候程序就會在此處停止叉存,只執(zhí)行到16行。那么到16行的執(zhí)行結(jié)果也會在控制臺輸出,就可以判斷16行之前腳本有沒有問題抹锄。
??
- Start from the Middle(從中間某處開始執(zhí)行)
這個功能也是用于調(diào)試使用啥寇。使用了這個功能那么在此處之前的腳本不再執(zhí)行。添加方法 和Stop in the Middle相同瞳秽。
??
- Run Any Single Command(單獨執(zhí)行某一條命令)
雙擊即可執(zhí)行一條單獨的命令,這主要用于編寫腳本時對于某一條腳本不確定其正確性時使用率翅。
Double-click any single command to run it by itself. This is useful when writing a single command. It lets you immediately test a command you are constructing, when you are not sure if it is correct. You can double-click it to see if it runs correctly. This is also available from the context menu.
??
Using Base URL to Run Test Cases in Different Domains
??
Selenium Commands – “Selenese”
Selenium 命令通常被稱作Selenese练俐。
這里我們詳細解釋了這些命令,并介紹了在使用Selenium時測試web應(yīng)用程序時所做的許多選擇冕臭。
In selenese, one can test the existence of UI elements based on their HTML tags, test for specific content, test for broken links, input fields, selection list options, submitting forms, and table data among other things. In addition Selenium commands support testing of window size, mouse position, alerts, Ajax functionality, pop up windows, event handling, and many other web-application features. The Command Reference lists all the available commands.
在selenese中腺晾,可以根據(jù)其HTML標記、特定內(nèi)容的測試辜贵、中斷鏈接的測試悯蝉、輸入字段、選擇列表選項念颈、提交表單和表數(shù)據(jù)等方式測試UI元素的存在泉粉。此外,Selenium命令支持測試窗口大小、鼠標位置嗡靡、警報跺撼、Ajax功能、彈出窗口讨彼、事件處理和其他許多web應(yīng)用程序特性歉井。Command Reference列出了所有可用的命令。
Selenium commands come in three “flavors”: Actions, Accessors, and Assertions.(這句話真不知道怎么翻譯哈误,就直接原文復(fù)制了)
Actions
操作(Actions)是通常操作應(yīng)用程序狀態(tài)的命令哩至。他們做的事情就像“點擊這個鏈接”和“選擇那個選項”。如果操作失敗蜜自,或有錯誤菩貌,當前測試的執(zhí)行將停止。Accessors
訪問器(Accessors)檢查應(yīng)用程序的狀態(tài)重荠,并將結(jié)果存儲在變量中箭阶,例如“storeTitle”。它們還用于自動生成斷言戈鲁。Assertions
斷言類(Assertions)似于訪問器仇参,但它們驗證應(yīng)用程序的狀態(tài)是否符合預(yù)期。比如“確保頁面標題為X”和“檢查復(fù)選框是否被選中”婆殿。
All Selenium Assertions can be used in 2 modes: “assert” and “verify”. For example, you can “assertText” and “verifyText”. When an “assert” fails, the test is aborted. When a “verify” fails, the test will continue execution, logging the failure. This allows a single “assert” to ensure that the application is on the correct page, followed by a bunch of “verify” assertions to test form field values, labels, etc.
所有的Selenium斷言都可以在兩種模式中使用:“assert”和“verify”诈乒。例如,您可以“assertText”和“verifyText”婆芦。當“assert”失敗時怕磨,測試將中止。當“驗證”失敗時寞缝,測試將繼續(xù)執(zhí)行癌压,記錄失敗仰泻。這允許單個“斷言”確保應(yīng)用程序在正確的頁面上荆陆,然后是一堆“驗證”斷言,以測試表單字段值集侯、標簽等被啼。
??
腳本語法(Script Syntax)
Selenium命令很簡單,它們由命令和兩個參數(shù)組成棠枉。即 command浓体、Target、Value辈讶。
參數(shù)并不總是必需的;這取決于命令命浴。在某些情況下,兩者都是必需的,在另一些情況下生闲,需要一個參數(shù)媳溺,而在另一些情況下,命令可能完全沒有參數(shù)碍讯。如下圖:
參數(shù)各不相同悬蔽,但它們通常是:
- 用于標識頁面內(nèi)的UI元素的定位器(locator)。
- 用于驗證或斷言頁面內(nèi)容的文本模式(text pattern)捉兴。
- 輸入字段中輸入文本的文本模式或selenium變量(selenium variables)蝎困,或從選項列表中選擇一個選項。
以上三點會在后面詳細介紹倍啥。
??
測試用例集(Test Suites)
測試用例集是指多個用例的集合禾乘。
??
常用 Selenium 命令(Commonly Used Selenium Commands)
總結(jié)我們對Selenium的介紹,我們將向您展示一些典型的Selenium命令虽缕。這些可能是用于構(gòu)建測試的最常用命令盖袭。
open
使用URL打開一個頁面。
click
執(zhí)行單擊操作彼宠,并可選地等待新頁面加載鳄虱。
type
輸入內(nèi)容。
sendKeys
鍵盤輸入凭峡。
verifyTitle/assertTitle
檢查當前頁面標題title拙已。
區(qū)別:verifyTitle 用于檢查當前頁面標題是等于期望值,如果不滿足摧冀,當前步驟失敗倍踪,腳本會繼續(xù)執(zhí)行;
assertTitle用于檢查當前頁面標題是等于期望值索昂,如果不滿足建车,當前腳本失敗,腳本不會繼續(xù)執(zhí)行椒惨。
eg:我們可以在 Test Case 開始時用assertTitle命令檢查頁面的 title 屬性是不是等于期望值缤至,如果不等于,可能是頁面跳轉(zhuǎn)有誤康谆,沒有必要繼續(xù)執(zhí)行后續(xù)操作领斥,腳本會即刻終止。
verifyTextPresent
驗證指定文本存在沃暗。
verifyElementPresent
驗證指定的UI元素存在月洛,如它的HTML標記所定義的,在頁面上顯示孽锥。
verifyText
驗證指定文本及其相應(yīng)的HTML標記在頁面上嚼黔。
verifyTable
驗證一個表格的預(yù)期內(nèi)容细层。
??
驗證頁面元素(Verifying Page Elements)
在web頁面上驗證UI元素可能是自動化測試最常見的特性。Selenese允許多種檢查UI元素的方法唬涧。理解這些不同的方法非常重要今艺,因為這些方法定義了實際測試的內(nèi)容。
比如你可能會測試:
- 一個元素出現(xiàn)在頁面的某個地方?
- 特定的文本在頁面的某個地方?
- 特定的文本位于頁面的特定位置?
第2點和第3點是不是有點繞爵卒?感覺像是一個意思虚缎。我特意請教了從事英語培訓(xùn)的妹妹幫忙解釋了一下,又結(jié)合官方文檔钓株,基本就是以下意思:
比如实牡,如果你正在測試一個文本標題,你可能比較在意的是這個標題的文本內(nèi)容和這個文本在的位置(比如是不是在頁面頂部)轴合。另一種情況是创坞,如果你正在測試一個主頁中顯示的圖片,這個圖片需要經(jīng)常被改變(圖片內(nèi)容和圖片顯示位置)受葛,但是你在測試的過程中只關(guān)心該頁面有沒有圖片题涨,并不關(guān)心圖片內(nèi)容和顯示位置。
以下是文檔解釋:
For example, if you are testing a text heading, the text and its position at the top of the page are probably relevant for your test. If, however, you are testing for the existence of an image on the home page, and the web designers frequently change the specific image file along with its position on the page, then you only want to test that an image (as opposed to the specific image file) exists somewhere on the page.
??
使用斷言還是驗證总滩?(Assertion or Verification?)
在前面已經(jīng)講了一些Assertion和Verification的區(qū)別纲堵。這里再進行一些補充說明。到底是使用Verification還是Assertion闰渔?
??在“斷言”和“驗證”之間進行選擇席函,歸根結(jié)底是為了方便對錯誤(不一定是錯誤,應(yīng)該是對預(yù)期的不符合冈涧,有時候我們的預(yù)期可能因為和 PM 之間理解的不同而出錯)的管理茂附。
??如果您在測試的時候檢查瀏覽器顯示的頁面不是預(yù)期的那一張(比如說頁碼錯誤,此時需要使用Assertion督弓,發(fā)現(xiàn)這類錯誤立即停止測試)营曼,那么你基本上就不需要檢查頁面上的第一段是否正確(因為該頁面的內(nèi)容都不應(yīng)該顯示在這個頁面)。如果出現(xiàn)這種情況愚隧,您可能想要中止您的測試用例蒂阱,以便您能夠及時地調(diào)查原因并解決問題(至少你想要該頁面顯示的內(nèi)容是符合預(yù)期,然后再去判斷內(nèi)容的對錯)奸攻。
??另一方面蒜危,您可能想要檢查頁面的許多屬性虱痕,而不是出現(xiàn)一次失敗就停止測試用例睹耐,因為這將允許您檢查頁面上的所有失敗并采取適當?shù)牟僮鳎ㄟ@個時候需要使用Verification,檢查出該用例的所有錯誤并記錄下來部翘,隨后再一一解決)硝训。
??實際上,一個“斷言”將會失敗,并中止當前的測試用例窖梁,而“驗證”將會失敗赘风,但繼續(xù)運行測試用例。
??該特性的最佳用法是在邏輯上對測試命令進行分組纵刘,并以“assert”開頭邀窃,然后用一個或多個“驗證”測試命令啟動每個組。一個例子:
Command | Target | Value |
---|---|---|
open | /projects/ide/ | |
assertTitle | Selenium IDE | |
verifyElementPresent | css=#mainContent img |
??上面的示例首先打開一個頁面假哎,然后“斷言”瞬捕,通過將標題與預(yù)期值進行比較,可以加載正確的頁面舵抹。只有當這條路徑通過后肪虎,下面的命令才會運行,并“驗證”圖像是否存在于預(yù)期的位置惧蛹。
??確定某一個元素的存在(verifyElementPresent)
當您必須測試特定UI元素的存在而不是其內(nèi)容時扇救,請使用此命令。此驗證不檢查文本香嗓,只檢查HTML標記迅腔。一個常用的方法是檢查圖像是否存在。
Command | Target | Value |
---|---|---|
verifyElementPresent | //div/p/img |
這個命令驗證一個圖像靠娱,它是由一個<img> HTML標記的存在所指定的钾挟,在頁面上顯示,并且它跟隨一個<div>標簽和<p>標簽饱岸。第一個(也是唯一的)參數(shù)是一個定位器掺出,用于告訴Selenese命令如何找到該元素。下一節(jié)將解釋定位器苫费。
verifyElementPresent可以用來檢查頁面內(nèi)任何HTML標記的存在汤锨。您可以檢查鏈接、段落百框、分區(qū)<div>的存在闲礼,等等。這里還有一些例子铐维。
Command | Target | Value |
---|---|---|
verifyElementPresent | //div/p | |
verifyElementPresent | //div/a | |
verifyElementPresent | id=Login | |
verifyElementPresent | link=Go to Marketing Research | |
verifyElementPresent | //a[2] | |
verifyElementPresent | //head/title |
這些例子說明了可以測試UI元素的各種方法柬泽。再次,下一節(jié)將解釋定位器(locators)嫁蛇。
??確定文本(verifyText)
當必須測試文本和它的UI元素時锨并,使用verifyText。verifyText必須使用定位器睬棚。如果選擇XPath或DOM定位器第煮,您可以驗證特定的文本是否出現(xiàn)在頁面上相對于頁面上其他UI組件的特定位置解幼。
Command | Target | Value |
---|---|---|
verifyText | //table/tr/td/div/p | This is my text and it occurs right after the div inside the table. |
??
定位元素(Locating Elements)
對于許多Selenium命令,需要一個Target包警。Target標識web應(yīng)用程序內(nèi)容中的一個元素撵摆,并包含位置策略,然后是格式locatorType=location的位置害晦。在許多情況下特铝,定位器類型(locator type)可以省略。下面解釋各種定位器類型壹瘟,并舉例說明苟呐。
??通過Identifier定位(Locating by Identifier)
這可能是最常用的定位元素的方法,當無可被識別的定位器類型使用時俐筋,所有的默認設(shè)置都是默認的牵素。使用此策略,將使用id屬性值與位置匹配的第一個元素澄者。如果沒有元素具有匹配的id屬性笆呆,那么將使用與位置匹配的name屬性的第一個元素。
例如粱挡,您的頁面源可以有如下id和name屬性:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>
下面的locator策略將從上面的HTML代碼片段中返回的元素表示為行號:
- identifier=loginForm (3)
- identifier=password (5)
- identifier=continue (6)
- continue (6)
由于定位器的標識符類型是默認的赠幕,所以在前面的三個示例中identifier=不是必要的。
??通過id定位(Locating by Id)
這種類型的定位器比Identifier定位符類型更受限制询筏,但也更加準確榕堰。當您知道一個元素的id屬性時,請使用它嫌套。
1 <html>
2 <body>
3 <form id="loginForm">
4 <input name="username" type="text" />
5 <input name="password" type="password" />
6 <input name="continue" type="submit" value="Login" />
7 <input name="continue" type="button" value="Clear" />
8 </form>
9 </body>
10 <html>
- id=loginForm (3)
??通過name定位(Locating by Name)
??在使用 name 進行元素定位的時候有時候會出現(xiàn)問題逆屡,即在一個頁面中如果多個元素 name 相同,那么只能定位到第一個元素與 name 匹配的踱讨。
??如果多個元素對name屬性具有相同的value魏蔗,那么可以使用篩選器進一步優(yōu)化定位策略。默認的過濾器類型是value(匹配value屬性)痹筛。
1 <html>
2 <body>
3 <form id="loginForm">
4 <input name="username" type="text" />
5 <input name="password" type="password" />
6 <input name="continue" type="submit" value="Login" />
7 <input name="continue" type="button" value="Clear" />
8 </form>
9 </body>
10 <html>
- name=username (4)
- name=continue value=Clear (7)
- name=continue Clear (7)
- name=continue type=button (7)
注意:
與某些類型的XPath和DOM定位器不同莺治,上述三種類型的定位器允許Selenium測試一個獨立于頁面位置的UI元素。因此帚稠,如果頁面結(jié)構(gòu)和組織被改變谣旁,測試仍然會通過。您可能也可能不想測試頁面結(jié)構(gòu)是否發(fā)生了變化滋早。在web設(shè)計人員經(jīng)常更改頁面的情況下榄审,但是它的功能必須經(jīng)過回歸測試,通過id和name屬性進行測試馆衔,或者通過任何HTML屬性進行測試變得非常重要瘟判。
??通過XPath定位(Locating by XPath)
XPath是用于在XML文檔中定位節(jié)點的語言怨绣。由于HTML可以是XML (XHTML)的實現(xiàn)角溃,Selenium用戶可以利用這種強大的語言來對web應(yīng)用程序中的元素進行定位拷获。XPath擴展了(以及支持)通過id或name屬性定位的簡單方法,并打開了各種新的可能性减细,例如在頁面上定位第三個復(fù)選框匆瓜。
使用XPath的一個主要原因是,當您沒有為希望定位的元素擁有合適的id或name屬性時未蝌⊥灾ǎ可以使用XPath以絕對項(不建議)定位元素,或者相對于具有id或name屬性的元素萧吠。XPath定位器還可以用于通過id和名稱以外的屬性指定元素左冬。
絕對xpath包含了來自根(html)的所有元素的位置,因此纸型,哪怕僅對應(yīng)用程序進行最輕微的調(diào)整拇砰,結(jié)果可能也會失敗。通過查找具有id或name屬性(理想的父元素)的附近元素狰腌,您可以根據(jù)關(guān)系定位目標元素锐峭。這種情況不太可能發(fā)生改變滋戳,并且可以使您的測試更加健壯。
因為只有xpath定位符以“//”開頭,所以在指定xpath定位符時不需要包含xpath=標簽筐赔。
1 <html>
2 <body>
3 <form id="loginForm">
4 <input name="username" type="text" />
5 <input name="password" type="password" />
6 <input name="continue" type="submit" value="Login" />
7 <input name="continue" type="button" value="Clear" />
8 </form>
9 </body>
10 <html>
- xpath=/html/body/form[1] (3) - Absolute path (would break if the HTML was changed only slightly)
- //form[1] (3) - First form element in the HTML
- xpath=//form[@id='loginForm'] (3) - The form element with attribute named ‘id’ and the value ‘loginForm’
xpath=//form[input/@name='username'] (3) - First form element with an input child element with attribute named ‘name’ and the value ‘username’ - //input[@name='username'] (4) - First input element with attribute named ‘name’ and the value ‘username’
- //form[@id='loginForm']/input[1] (4) - First input child element of the form element with attribute named ‘id’ and the value ‘loginForm’
- //input[@name='continue'][@type='button'] (7) - Input with attribute named ‘name’ and the value ‘continue’ and attribute named ‘type’ and the value ‘button’
- //form[@id='loginForm']/input[4] (7) - Fourth input child element of the form element with attribute named ‘id’ and value ‘loginForm’
這些例子包括一些基本知識,但是為了了解更多昼汗,推薦以下參考:
您可以使用瀏覽器的devtools復(fù)制XPath:
??通過鏈接文本定位超鏈接朗涩。(Locating Hyperlinks by Link Text)
這是一個簡單的方法,通過使用鏈接的文本甥材,在你的網(wǎng)頁中找到一個超鏈接教馆。如果存在兩個與同一文本的鏈接,則將使用第一個匹配擂达。
1 <html>
2 <body>
3 <p>Are you sure you want to do this?</p>
4 <a href="continue.html">Continue</a>
5 <a href="cancel.html">Cancel</a>
6 </body>
7 <html>
- link=Continue (4)
- link=Cancel (5)
??通過CSS定位(Locating by CSS)
CSS(層疊樣式表)是描述HTML和XML文檔呈現(xiàn)的語言土铺。CSS使用選擇器將樣式屬性綁定到文檔中的元素。這些選擇器可以作為另一種定位策略使用板鬓。
1 <html>
2 <body>
3 <form id="loginForm">
4 <input class="required" name="username" type="text" />
5 <input class="required passfield" name="password" type="password" />
6 <input name="continue" type="submit" value="Login" />
7 <input name="continue" type="button" value="Clear" />
8 </form>
9 </body>
10 <html>
- css=form#loginForm (3)
- css=input[name="username"] (4)
- css=input.required[type="text"] (4)
- css=input.passfield (5)
- css=#loginForm input[type="button"] (7)
- css=#loginForm input:nth-child(2) (5)
有關(guān)CSS選擇器的更多信息悲敷,最好的去處是 the W3C publication。你會在那里找到更多的參考資料俭令。
注意:
大多數(shù)有經(jīng)驗的Selenium用戶推薦CSS作為其選擇的定位策略后德,因為它比XPath快得多,并且能夠在一個內(nèi)在的HTML文檔中找到最復(fù)雜的對象抄腔。
??隱式定位器(Implicit Locators)
您可以選擇在以下情況中省略locator類型:
沒有顯式定義定位器策略的定位器將默認使用標識符(identifier)定位策略瓢湃。參考Locating by Identifier理张。
以“//”開頭的定位器將使用XPath定位器策略。參考Locating by XPath绵患。
??
存儲 commands 和 Selenium 變量(Store Commands and Selenium Variables)
您可以使用Selenium變量在腳本的開頭存儲常量雾叭。另外,當結(jié)合一個數(shù)據(jù)驅(qū)動的測試設(shè)計(在后面的部分中討論)時落蝙,Selenium變量可以用來存儲從命令行织狐、另一個程序或文件中傳遞給您的測試程序的值。
plain store命令是許多存儲命令中最基本的筏勒,可以用來簡單地在selenium變量中存儲一個常量值移迫。它需要兩個參數(shù),要存儲的文本值和一個selenium變量管行。在為變量選擇名稱時厨埋,使用唯一字母數(shù)字字符的標準變量命名約定。
Command | Target | Value |
---|---|---|
store | paul@mysite.org | userName |
稍后在您的腳本中捐顷,您將希望使用變量的存儲值荡陷。要訪問變量的值,請將變量括在花括號({})中套菜,并在它前面加上一個美元符號亲善。
Command | Target | Value |
---|---|---|
verifyText | //div/p | ${userName} |
Command | Target | Value |
---|---|---|
type | id=login | ${userName} |
變量的一個常見用途是為輸入字段存儲輸入。
Command | Target | Value |
---|---|---|
type | id=login | ${userName} |
Selenium變量可以在第一個參數(shù)或第二個參數(shù)中使用逗柴,并且在該命令執(zhí)行的任何其他操作之前都可以由Selenium解釋蛹头。在locator表達式中也可以使用Selenium變量。
每個verify和assert命令都存在一個等效的存儲命令戏溺。下面是一些常用的存儲命令渣蜗。
??存儲文本(storeText)
StoreText對應(yīng)verifyText。它使用定位器來識別特定的頁面文本旷祸。如果發(fā)現(xiàn)文本耕拷,則存儲在變量中。StoreText可用于從正在測試的頁面中提取文本托享。
??
echo - Selenese打印命令(echo - The Selenese Print Command)
Selenese有一個簡單的命令骚烧,允許您將文本打印到測試的輸出中。這對于在測試運行時在控制臺上顯示的測試中提供信息進度說明非常有用闰围。這些注釋還可以用于在測試結(jié)果報告中提供上下文赃绊,這對于在測試發(fā)現(xiàn)問題時發(fā)現(xiàn)頁面上存在缺陷的地方非常有用。最后羡榴,可以使用echo語句打印Selenium變量的內(nèi)容碧查。
??
提示(提醒)、彈出窗口和多個窗口(Alerts, Popups, and Multiple Windows)
Suppose that you are testing a page that looks like this.
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function output(resultText){
document.getElementById('output').childNodes[0].nodeValue=resultText;
}
function show_confirm(){
var confirmation=confirm("Chose an option.");
if (confirmation==true){
output("Confirmed.");
}
else{
output("Rejected!");
}
}
function show_alert(){
alert("I'm blocking!");
output("Alert is gone.");
}
function show_prompt(){
var response = prompt("What's the best web QA tool?","Selenium");
output(response);
}
function open_window(windowName){
window.open("newWindow.html",windowName);
}
</script>
</head>
<body>
<input type="button" id="btnConfirm" onclick="show_confirm()" value="Show confirm box" />
<input type="button" id="btnAlert" onclick="show_alert()" value="Show alert" />
<input type="button" id="btnPrompt" onclick="show_prompt()" value="Show prompt" />
<a href="newWindow.html" id="lnkNewWindow" target="_blank">New Window Link</a>
<input type="button" id="btnNewNamelessWindow" onclick="open_window()" value="Open Nameless Window" />
<input type="button" id="btnNewNamedWindow" onclick="open_window('Mike')" value="Open Named Window" />
<br />
<span id="output">
</span>
</body>
</html>
用戶必須響應(yīng)alert(提示)/確認框,以及將焦點轉(zhuǎn)移到新打開的彈出窗口忠售。幸運的是传惠,Selenium可以覆蓋JavaScript彈出框。
但是稻扬,在我們開始介紹每個細節(jié)的alert/確認/提示之前卦方,了解它們之間的共性是有幫助的。alert腐螟、確認框和提示都有以下變化愿汰。
Command | Description |
---|---|
assertFoo(pattern) | throws error if pattern doesn’t match the text of the pop-up |
assertFooPresent | throws error if pop-up is not available |
assertFooNotPresent | throws error if any pop-up is present |
storeFoo(variable) | stores the text of the pop-up in a variable |
storeFooPresent(variable) | stores the text of the pop-up in a variable and returns true or false |
在Selenium運行時困后,不會出現(xiàn)JavaScript彈出窗口乐纸。這是因為函數(shù)調(diào)用實際上是由Selenium自己的JavaScript在運行時覆蓋的。然而摇予,僅僅因為你看不到彈出窗口并不意味著你不必去處理它汽绢。要處理彈出式,您必須調(diào)用它的assertFoo(pattern)函數(shù)侧戴。如果您無法斷言彈出的下一個命令將被阻塞宁昭,您將會得到一個類似于以下[錯誤]錯誤的錯誤:有一個意外的確認!(選擇一個選項。)
??Alerts
Command | Target | Value |
---|---|---|
open | / | |
click | btnAlert | |
assertAlert | I’m blocking! | |
verifyTextPresent | Alert is gone. |
讓我們從alerts開始酗宋,因為它們是處理的最簡單的彈出窗口积仗。首先,在瀏覽器中打開HTML示例蜕猫,然后單擊“顯示alert”按鈕寂曹。您會注意到,在關(guān)閉alert后回右,文本“ alert已經(jīng)消失”隆圆。顯示在頁面上。現(xiàn)在使用Selenium IDE記錄運行相同的步驟翔烁,并在關(guān)閉alert后驗證文本渺氧。你的測試會是這樣的:
Command | Target | Value |
---|---|---|
open | / | |
click | btnAlert | |
assertAlert | I’m blocking! | |
verifyTextPresent | Alert is gone. |
你可能會想:“這很奇怪,我從來沒有想過要斷言一個 alert蹬屹÷卤常”“但這是Selenium-IDE 處理和關(guān)閉alert。如果您刪除該步驟并重播測試慨默,您將得到以下error[error]:There was an unexpected Alert! [I'm blocking!]. 贩耐。您必須包括對警報的斷言,以確認它的存在业筏。
如果你只是想斷言一個警告存在憔杨,不知道,或者不關(guān)心它的內(nèi)容蒜胖,你可以使用assertAlertPresent消别。這將返回true或false抛蚤,如果是 false 則停止測試。
??確認(Confirmations)
確認行為與警報的行為方式大致相同寻狂,帶有assertConfirmation和assertConfirmationPresent岁经,提供與警告副本相同的特性。但是蛇券,默認情況下缀壤,當確認出現(xiàn)時,Selenium將選擇OK纠亚。在示例頁面中塘慕,嘗試記錄單擊“Show confirm box”按鈕,但單擊彈出窗口中的“Cancel”按鈕蒂胞,然后斷言輸出文本图呢。你的測試可能是這樣的:
Command | Target | Value |
---|---|---|
open | / | |
click | btnConfirm | |
chooseCancelOnNextConfirmation | ||
assertConfirmation | Choose an option. | |
verifyTextPresent Rej | ected |
choosecancelonnextconfirm函數(shù)告訴Selenium,所有后續(xù)確認都應(yīng)該返回false骗随。它可以通過調(diào)用chooseokonnextconfirm來重置蛤织。
您可能注意到您不能重放這個測試,因為Selenium抱怨有一個未處理的確認鸿染。這是因為Selenium ide記錄導(dǎo)致的事件的順序點擊chooseCancelOnNextConfirmation放在錯誤的訂單(是有道理的,如果你仔細想想,硒不能知道你取消之前你打開一個確認)只要切換這兩個命令,您的測試將會很好指蚜。
??提示框(Prompts)
提示的行為方式與警告相同,帶有assertPrompt和assertPromptPresent涨椒,提供與它們的警報對等物相同的特性摊鸡。默認情況下,當提示出現(xiàn)時丢烘,Selenium將等待您輸入數(shù)據(jù)柱宦。嘗試在示例頁面中單擊“Show prompt”按鈕,并在提示中輸入“Selenium”播瞳。你的測試可能是這樣的:
Command | Target | Value |
---|---|---|
open | / | |
answerOnNextPrompt | Selenium! | |
click | id=btnPrompt | |
assertPrompt | What’s the best web QA tool? | |
verifyTextPresent Se | lenium! |
如果您在提示框(Prompts)上選擇“取消”按鈕掸刊,您可能會注意到,answerOnNextPrompt只會顯示一個空的目標赢乓。Selenium處理cancel忧侧,在提示符上的空白條目基本上與此相同。
??
調(diào)試(Debugging)
調(diào)試意味著在您的測試用例中發(fā)現(xiàn)并修復(fù)錯誤牌芋。這是測試用例開發(fā)的正常部分蚓炬。
我們不會在這里教調(diào)試,因為大多數(shù)新用戶都已經(jīng)有了一些調(diào)試的基本經(jīng)驗躺屁。如果這對您來說是陌生的肯夏,我們建議您詢問您的組織中的一個開發(fā)人員。
??斷點(Breakpoints)
Selelenium IDE支持斷點的設(shè)置和啟動和停止測試用例運行的能力,從測試用例中的任何一點開始驯击。也就是說烁兰,您可以在測試用例的中間運行一個特定的命令,并檢查測試用例在這一點上的行為徊都。為此沪斟,在您希望檢查的命令上設(shè)置斷點。
要設(shè)置斷點暇矫,請選擇一個命令主之,右鍵單擊,并從上下文菜單中選擇Toggle breakpoint李根。然后單擊Run按鈕槽奕,從開始到斷點運行測試用例。
有時朱巨,在測試用例的中間位置或在開始點之后的斷點上運行測試用例也是有用的史翘。例如枉长,假設(shè)您的測試用例首先登錄到網(wǎng)站冀续,然后執(zhí)行一系列測試,您正在嘗試調(diào)試其中的一個測試必峰。但是洪唐,您只需要登錄一次,但是您需要在開發(fā)測試時繼續(xù)重新運行測試吼蚁。您可以登錄一次凭需,然后從測試用例的登錄部分后的startpoint運行您的測試用例。這將防止您每次重新運行測試用例時不得不手動退出肝匆。
??逐步執(zhí)行用例(Stepping Through a Testcase)
要一次執(zhí)行一個測試用例(“step through”)粒蜈,只需反復(fù)按下這個按鈕。
??Find Button
Find按鈕用于查看當前所選的Selenium命令中當前顯示的頁面上的UI元素(在瀏覽器中)旗国。這在為命令的第一個參數(shù)構(gòu)建定位器時非常有用(請參閱Selenium命令章節(jié)中關(guān)于定位器的部分)枯怖。它可以與任何用于標識網(wǎng)頁上的UI元素的命令一起使用,例如能曾,單擊度硝、單擊、鍵入寿冕、以及某些斷言和驗證命令等蕊程。
從表視圖中,選擇具有l(wèi)ocator參數(shù)的任何命令驼唱。點擊查找按鈕≡迕現(xiàn)在看一下網(wǎng)頁:應(yīng)該有一個明亮的綠色矩形包圍著由locator參數(shù)指定的元素。
??頁面源代碼進行調(diào)試(Page Source for Debugging)
通常,在調(diào)試測試用例時辨赐,您必須查看頁面源(用于測試的網(wǎng)頁的HTML)來確定問題岗钩。瀏覽器使你只需右鍵點擊頁面,然后點擊檢查肖油。它將打開瀏覽器的devtools兼吓,這很容易讓您瀏覽頁面源代碼。