想偷懶,不想做很機械重復的網頁操作,就百度了一下看看有什么方法,能把自己從重復性的網頁操作中解放出來,於是,百度到了selenium ide,折騰許久,用最新版火狐添加了自帶selenium ide組件,初步實現了解放雙手。順便參考了網上好的相關文章,整理如下:
上網查了一些介紹,發現一些教程基本都是比較老版本的了,使用起來略有不便,所以今天試着寫一些最新版本的。請參考Selenium官網。文章以下內容都是在 Mac 機器上按照 Selenium-IDE官方文檔編寫,適用於當前最新版本。其實官方文檔寫的很好,圖文並茂,可以試着研讀官方的。
這篇文章講的是 Selenium-IDE,不是 Selenium。
為什么這么說?請看下圖。
Selenium
Selenium-IDE 只是一個錄制腳本的工具。僅僅作為入門使用。
目前 Selenium-IDE不僅支持FireFox,還支持 Chrome。本文以 FireFox 為例。
添加組件 Selenium IDE
FireFox 所有的組件
搜索組件 Senlenium IDE
將 Senlenium 添加到 Firefox
Selenium 添加過以后就出現在了瀏覽器菜單欄的最右側,如文章第一張圖Se 圖標【如果,找不到圖標,可以去火狐web開發者中找一下】。雙擊圖標打開 Selenium IDE,如下圖:
Selenium IDE
IDE 主要功能(IDE Features)
工具欄(Toolbar)
速度控制:用來控制用例執行速度。
run all tests 運行所有test; 全部執行:如果當前工程有多個測試用例,使用該按鈕就會將用例全部執行。
run current test 運行當前test; 單個執行:使用該按鈕只會自行當前選中的用例。如果當前工程只有一個用例,那么這個按鈕和“全部執行”按鈕效果相同。
pause on exceptions 異常時暫停
disable breakpoints 禁用斷點
step over current command 跨過當然命令 逐步執行:用來逐步逐步執行一個用例。主要用來調試用例。
錄制:用來錄制用戶在瀏覽器上的操作腳本。工具欄最右側的紅色原點就是錄制按鈕,用來錄制用戶在瀏覽器上的操作腳本。
**測試用例面板(Test Case Panel)**
- 1
錄制的腳本會顯示在這里
測試用例面板
Command、Target和Value輸入字段顯示當前選擇的命令及其參數。這些是可以修改當前選擇的命令的輸入字段。在底部窗格的Reference選項卡中指定用於命令的第一個參數總是位於Target字段中。如果第二個參數由Reference選項卡指定,則它總是位於Value字段中。注釋字段(Comment)允許您給當前命令添加注釋,方便日后閱讀。
命令配置
備注:Reference 選項卡是一個很有用的功能,這里用來顯示當前選中 Command 的功能說明,包括該 Command 所需要的參數(不是所有的 Command 都必須具備 Target 和 Value 兩個值),便於快速了解 Command 用法。我查看了其他的文檔發現之前的版本是有的。現在被官方暫時隱藏了,不久的將來會再次開放。
導航面版(Navigation Panel)
(左圖是2018年參考文章的作者的截圖)
(這個是20190723下載最新的截圖)
不是很清楚這個導航面板是干啥的。
控制台面板(Console Panel)
Log
當您運行測試用例時,顯示進度的錯誤消息和信息消息會自動顯示在這個窗格中,即使您不首先選擇Log選項卡。這些消息通常用於測試用例調試。
注意清除日志的清除按鈕【下圖右上角那個圓圈+斜杠就是】。
Log
Reference
建立測試用例(Building Test Cases)
There are three primary methods for developing test cases. Frequently, a test developer will require all three techniques.
錄制(Recording)
第一次使用 Selenium IDE 建議使用錄制功能,錄制按鈕默認是關閉的(之前的版本是默認打開),紅色原點表示錄制功能處於關閉狀態。
錄制過程中,Selenium-IDE會根據你在網頁上的操作動作自動在Test Case Panel填充腳本命令(commands),這些命令主要有以下類型:
- 點擊一個鏈接 ->一次點擊命令;
- 輸入一個值 - >輸入命令;
- 從下拉列表中選擇一個值 - >選擇命令;
- 點擊復選框或者單選框(clicking checkboxes or radio buttons)- >點擊命令; #菜鳥解釋第四條:復選框就是多選框,可以選中多個;單選框就是各個選項是互斥的,只能選中一個。
- 輸入命令(type command)可能需要單擊web頁面的其他區域來記錄(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 的時候可能不會有這么多選項,隨着使用次數的增多更多的命令會被自動添加到這個菜單中。
編輯(Editing)
插入命令(Insert Command)
在測試用例面板中(Test Case Panel) 選中您想要插入命令的測試用例中的命令(command)。左鍵單擊要插入新命令的行。右鍵單擊並選擇Insert命令;IDE將在您選擇的行前面添加一個空行。現在使用命令編輯文本字段來輸入新命令及其參數。
插入命令及其參數
插入評論(Insert Comment)
我們可以給每一條 command 添加評論,提高腳本可讀性。
Insert Comment
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 的時候已經介紹了如何執行測試用例,這里補充幾個:
- Stop in the Middle(打斷點)。
斷點的最大作用就是調試,能幫助最快找到問題所在點。比如下圖我們想要給第17行打斷點,就選中改行,右鍵單擊,選擇 Toggle breakpoint。那么再執行腳本的時候程序就會在此處停止,只執行到16行。那么到16行的執行結果也會在控制台輸出,就可以判斷16行之前腳本有沒有問題。
斷點
- Start from the Middle(從中間某處開始執行)
這個功能也是用於調試使用。使用了這個功能那么在此處之前的腳本不再執行。添加方法 和Stop in the Middle相同。
Start from the Middle
- Run Any Single Command(單獨執行某一條命令)
雙擊即可執行一條單獨的命令,這主要用於編寫腳本時對於某一條腳本不確定其正確性時使用。
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應用程序時所做的許多選擇。
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中,可以根據其HTML標記、特定內容的測試、中斷鏈接的測試、輸入字段、選擇列表選項、提交表單和表數據等方式測試UI元素的存在。此外,Selenium命令支持測試窗口大小、鼠標位置、警報、Ajax功能、彈出窗口、事件處理和其他許多web應用程序特性。Command Reference列出了所有可用的命令。
Selenium commands come in three “flavors”: Actions, Accessors, and Assertions.(這句話真不知道怎么翻譯,就直接原文復制了)
-
Actions
操作(Actions)是通常操作應用程序狀態的命令。他們做的事情就像“點擊這個鏈接”和“選擇那個選項”。如果操作失敗,或有錯誤,當前測試的執行將停止。 -
Accessors
訪問器(Accessors)檢查應用程序的狀態,並將結果存儲在變量中,例如“storeTitle”。它們還用於自動生成斷言。 -
Assertions
斷言類(Assertions)似於訪問器,但它們驗證應用程序的狀態是否符合預期。比如“確保頁面標題為X”和“檢查復選框是否被選中”。
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”失敗時,測試將中止。當“驗證”失敗時,測試將繼續執行,記錄失敗。這允許單個“斷言”確保應用程序在正確的頁面上,然后是一堆“驗證”斷言,以測試表單字段值、標簽等。
腳本語法(Script Syntax)
Selenium命令很簡單,它們由命令和兩個參數組成。即 command、Target、Value。
參數並不總是必需的;這取決於命令。在某些情況下,兩者都是必需的,在另一些情況下,需要一個參數,而在另一些情況下,命令可能完全沒有參數。如下圖:
Selenium命令組成示例
參數各不相同,但它們通常是:
- 用於標識頁面內的UI元素的定位器(locator)。
- 用於驗證或斷言頁面內容的文本模式(text pattern)。
- 輸入字段中輸入文本的文本模式或selenium變量(selenium variables),或從選項列表中選擇一個選項。
以上三點會在后面詳細介紹。
測試用例集(Test Suites)
測試用例集是指多個用例的集合。
執行測試用例集
常用 Selenium 命令(Commonly Used Selenium Commands)
總結我們對Selenium的介紹,我們將向您展示一些典型的Selenium命令。這些可能是用於構建測試的最常用命令。
open
使用URL打開一個頁面。
click
執行單擊操作,並可選地等待新頁面加載。
type
輸入內容。
sendKeys
鍵盤輸入。
verifyTitle/assertTitle
檢查當前頁面標題title。
區別:verifyTitle 用於檢查當前頁面標題是等於期望值,如果不滿足,當前步驟失敗,腳本會繼續執行;
assertTitle用於檢查當前頁面標題是等於期望值,如果不滿足,當前腳本失敗,腳本不會繼續執行。
eg:我們可以在 Test Case 開始時用assertTitle命令檢查頁面的 title 屬性是不是等於期望值,如果不等於,可能是頁面跳轉有誤,沒有必要繼續執行后續操作,腳本會即刻終止。
verifyTextPresent
驗證指定文本存在。
verifyElementPresent
驗證指定的UI元素存在,如它的HTML標記所定義的,在頁面上顯示。
verifyText
驗證指定文本及其相應的HTML標記在頁面上。
verifyTable
驗證一個表格的預期內容。
驗證頁面元素(Verifying Page Elements)
在web頁面上驗證UI元素可能是自動化測試最常見的特性。Selenese允許多種檢查UI元素的方法。理解這些不同的方法非常重要,因為這些方法定義了實際測試的內容。
比如你可能會測試:
- 一個元素出現在頁面的某個地方?
- 特定的文本在頁面的某個地方?
- 特定的文本位於頁面的特定位置?
第2點和第3點是不是有點繞?感覺像是一個意思。我特意請教了從事英語培訓的妹妹幫忙解釋了一下,又結合官方文檔,基本就是以下意思:
比如,如果你正在測試一個文本標題,你可能比較在意的是這個標題的文本內容和這個文本在的位置(比如是不是在頁面頂部)。另一種情況是,如果你正在測試一個主頁中顯示的圖片,這個圖片需要經常被改變(圖片內容和圖片顯示位置),但是你在測試的過程中只關心該頁面有沒有圖片,並不關心圖片內容和顯示位置。
以下是文檔解釋:
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?)
在前面已經講了一些Assertion和Verification的區別。這里再進行一些補充說明。到底是使用Verification還是Assertion?
在“斷言”和“驗證”之間進行選擇,歸根結底是為了方便對錯誤(不一定是錯誤,應該是對預期的不符合,有時候我們的預期可能因為和 PM 之間理解的不同而出錯)的管理。
如果您在測試的時候檢查瀏覽器顯示的頁面不是預期的那一張(比如說頁碼錯誤,此時需要使用Assertion,發現這類錯誤立即停止測試),那么你基本上就不需要檢查頁面上的第一段是否正確(因為該頁面的內容都不應該顯示在這個頁面)。如果出現這種情況,您可能想要中止您的測試用例,以便您能夠及時地調查原因並解決問題(至少你想要該頁面顯示的內容是符合預期,然后再去判斷內容的對錯)。
另一方面,您可能想要檢查頁面的許多屬性,而不是出現一次失敗就停止測試用例,因為這將允許您檢查頁面上的所有失敗並采取適當的操作(這個時候需要使用Verification,檢查出該用例的所有錯誤並記錄下來,隨后再一一解決)。
實際上,一個“斷言”將會失敗,並中止當前的測試用例,而“驗證”將會失敗,但繼續運行測試用例。
該特性的最佳用法是在邏輯上對測試命令進行分組,並以“assert”開頭,然后用一個或多個“驗證”測試命令啟動每個組。一個例子:
Command | Target | Value |
---|---|---|
open | /projects/ide/ | |
assertTitle | Selenium IDE | |
verifyElementPresent | css=#mainContent img |
上面的示例首先打開一個頁面,然后“斷言”,通過將標題與預期值進行比較,可以加載正確的頁面。只有當這條路徑通過后,下面的命令才會運行,並“驗證”圖像是否存在於預期的位置。
確定某一個元素的存在(verifyElementPresent)
當您必須測試特定UI元素的存在而不是其內容時,請使用此命令。此驗證不檢查文本,只檢查HTML標記。一個常用的方法是檢查圖像是否存在。
Command | Target | Value |
---|---|---|
verifyElementPresent | //div/p/img |
這個命令驗證一個圖像,它是由一個 HTML標記的存在所指定的,在頁面上顯示,並且它跟隨一個
標簽。第一個(也是唯一的)參數是一個定位器,用於告訴Selenese命令如何找到該元素。下一節將解釋定位器。
verifyElementPresent可以用來檢查頁面內任何HTML標記的存在。您可以檢查鏈接、段落、分區
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元素的各種方法。再次,下一節將解釋定位器(locators)。
確定文本(verifyText)
當必須測試文本和它的UI元素時,使用verifyText。verifyText必須使用定位器。如果選擇XPath或DOM定位器,您可以驗證特定的文本是否出現在頁面上相對於頁面上其他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應用程序內容中的一個元素,並包含位置策略,然后是格式locatorType=location的位置。在許多情況下,定位器類型(locator type)可以省略。下面解釋各種定位器類型,並舉例說明。
通過Identifier定位(Locating by Identifier)
這可能是最常用的定位元素的方法,當無可被識別的定位器類型使用時,所有的默認設置都是默認的。使用此策略,將使用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 進行元素定位的時候有時候會出現問題,即在一個頁面中如果多個元素 name 相同,那么只能定位到第一個元素與 name 匹配的。
如果多個元素對name屬性具有相同的value,那么可以使用篩選器進一步優化定位策略。默認的過濾器類型是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元素。因此,如果頁面結構和組織被改變,測試仍然會通過。您可能也可能不想測試頁面結構是否發生了變化。在web設計人員經常更改頁面的情況下,但是它的功能必須經過回歸測試,通過id和name屬性進行測試,或者通過任何HTML屬性進行測試變得非常重要。
通過XPath定位(Locating by XPath)
XPath是用於在XML文檔中定位節點的語言。由於HTML可以是XML (XHTML)的實現,Selenium用戶可以利用這種強大的語言來對web應用程序中的元素進行定位。XPath擴展了(以及支持)通過id或name屬性定位的簡單方法,並打開了各種新的可能性,例如在頁面上定位第三個復選框。
使用XPath的一個主要原因是,當您沒有為希望定位的元素擁有合適的id或name屬性時。可以使用XPath以絕對項(不建議)定位元素,或者相對於具有id或name屬性的元素。XPath定位器還可以用於通過id和名稱以外的屬性指定元素。
絕對xpath包含了來自根(html)的所有元素的位置,因此,哪怕僅對應用程序進行最輕微的調整,結果可能也會失敗。通過查找具有id或name屬性(理想的父元素)的附近元素,您可以根據關系定位目標元素。這種情況不太可能發生改變,並且可以使您的測試更加健壯。
因為只有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復制XPath:
使用devtools復制XPath
通過鏈接文本定位超鏈接。(Locating Hyperlinks by Link Text)
這是一個簡單的方法,通過使用鏈接的文本,在你的網頁中找到一個超鏈接。如果存在兩個與同一文本的鏈接,則將使用第一個匹配。
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文檔呈現的語言。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)
有關CSS選擇器的更多信息,最好的去處是 the W3C publication。你會在那里找到更多的參考資料。
注意:
大多數有經驗的Selenium用戶推薦CSS作為其選擇的定位策略,因為它比XPath快得多,並且能夠在一個內在的HTML文檔中找到最復雜的對象。
隱式定位器(Implicit Locators)
您可以選擇在以下情況中省略locator類型:
-
沒有顯式定義定位器策略的定位器將默認使用標識符(identifier)定位策略。參考Locating by Identifier。
-
以“//”開頭的定位器將使用XPath定位器策略。參考Locating by XPath。
存儲 commands 和 Selenium 變量(Store Commands and Selenium Variables)
您可以使用Selenium變量在腳本的開頭存儲常量。另外,當結合一個數據驅動的測試設計(在后面的部分中討論)時,Selenium變量可以用來存儲從命令行、另一個程序或文件中傳遞給您的測試程序的值。
plain store命令是許多存儲命令中最基本的,可以用來簡單地在selenium變量中存儲一個常量值。它需要兩個參數,要存儲的文本值和一個selenium變量。在為變量選擇名稱時,使用唯一字母數字字符的標准變量命名約定。
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變量可以在第一個參數或第二個參數中使用,並且在該命令執行的任何其他操作之前都可以由Selenium解釋。在locator表達式中也可以使用Selenium變量。
每個verify和assert命令都存在一個等效的存儲命令。下面是一些常用的存儲命令。
存儲文本(storeText)
StoreText對應verifyText。它使用定位器來識別特定的頁面文本。如果發現文本,則存儲在變量中。StoreText可用於從正在測試的頁面中提取文本。
echo - Selenese打印命令(echo - The Selenese Print Command)
Selenese有一個簡單的命令,允許您將文本打印到測試的輸出中。這對於在測試運行時在控制台上顯示的測試中提供信息進度說明非常有用。這些注釋還可以用於在測試結果報告中提供上下文,這對於在測試發現問題時發現頁面上存在缺陷的地方非常有用。最后,可以使用echo語句打印Selenium變量的內容。
提示(提醒)、彈出窗口和多個窗口(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>
用戶必須響應alert(提示)/確認框,以及將焦點轉移到新打開的彈出窗口。幸運的是,Selenium可以覆蓋JavaScript彈出框。
但是,在我們開始介紹每個細節的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運行時,不會出現JavaScript彈出窗口。這是因為函數調用實際上是由Selenium自己的JavaScript在運行時覆蓋的。然而,僅僅因為你看不到彈出窗口並不意味着你不必去處理它。要處理彈出式,您必須調用它的assertFoo(pattern)函數。如果您無法斷言彈出的下一個命令將被阻塞,您將會得到一個類似於以下[錯誤]錯誤的錯誤:有一個意外的確認!(選擇一個選項。)
Alerts
Command | Target | Value |
---|---|---|
open | / | |
click | btnAlert | |
assertAlert | I’m blocking! | |
verifyTextPresent | Alert is gone. |
讓我們從alerts開始,因為它們是處理的最簡單的彈出窗口。首先,在瀏覽器中打開HTML示例,然后單擊“顯示alert”按鈕。您會注意到,在關閉alert后,文本“ alert已經消失”。顯示在頁面上。現在使用Selenium IDE記錄運行相同的步驟,並在關閉alert后驗證文本。你的測試會是這樣的:
Command | Target | Value |
---|---|---|
open | / | |
click | btnAlert | |
assertAlert | I’m blocking! | |
verifyTextPresent | Alert is gone. |
你可能會想:“這很奇怪,我從來沒有想過要斷言一個 alert。”“但這是Selenium-IDE 處理和關閉alert。如果您刪除該步驟並重播測試,您將得到以下error[error]:There was an unexpected Alert! [I’m blocking!]. 。您必須包括對警報的斷言,以確認它的存在。
如果你只是想斷言一個警告存在,不知道,或者不關心它的內容,你可以使用assertAlertPresent。這將返回true或false,如果是 false 則停止測試。
確認(Confirmations)
確認行為與警報的行為方式大致相同,帶有assertConfirmation和assertConfirmationPresent,提供與警告副本相同的特性。但是,默認情況下,當確認出現時,Selenium將選擇OK。在示例頁面中,嘗試記錄單擊“Show confirm box”按鈕,但單擊彈出窗口中的“Cancel”按鈕,然后斷言輸出文本。你的測試可能是這樣的:
Command | Target | Value |
---|---|---|
open | / | |
click | btnConfirm | |
chooseCancelOnNextConfirmation | ||
assertConfirmation | Choose an option. | |
verifyTextPresent Rej | ected |
choosecancelonnextconfirm函數告訴Selenium,所有后續確認都應該返回false。它可以通過調用chooseokonnextconfirm來重置。
您可能注意到您不能重放這個測試,因為Selenium抱怨有一個未處理的確認。這是因為Selenium ide記錄導致的事件的順序點擊chooseCancelOnNextConfirmation放在錯誤的訂單(是有道理的,如果你仔細想想,硒不能知道你取消之前你打開一個確認)只要切換這兩個命令,您的測試將會很好。
提示框(Prompts)
提示的行為方式與警告相同,帶有assertPrompt和assertPromptPresent,提供與它們的警報對等物相同的特性。默認情況下,當提示出現時,Selenium將等待您輸入數據。嘗試在示例頁面中單擊“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,在提示符上的空白條目基本上與此相同。
調試(Debugging)
調試意味着在您的測試用例中發現並修復錯誤。這是測試用例開發的正常部分。
我們不會在這里教調試,因為大多數新用戶都已經有了一些調試的基本經驗。如果這對您來說是陌生的,我們建議您詢問您的組織中的一個開發人員。
斷點(Breakpoints)
Selelenium IDE支持斷點的設置和啟動和停止測試用例運行的能力,從測試用例中的任何一點開始。也就是說,您可以在測試用例的中間運行一個特定的命令,並檢查測試用例在這一點上的行為。為此,在您希望檢查的命令上設置斷點。
要設置斷點,請選擇一個命令,右鍵單擊,並從上下文菜單中選擇Toggle breakpoint。然后單擊Run按鈕,從開始到斷點運行測試用例。
有時,在測試用例的中間位置或在開始點之后的斷點上運行測試用例也是有用的。例如,假設您的測試用例首先登錄到網站,然后執行一系列測試,您正在嘗試調試其中的一個測試。但是,您只需要登錄一次,但是您需要在開發測試時繼續重新運行測試。您可以登錄一次,然后從測試用例的登錄部分后的startpoint運行您的測試用例。這將防止您每次重新運行測試用例時不得不手動退出。
逐步執行用例(Stepping Through a Testcase)
要一次執行一個測試用例(“step through”),只需反復按下這個按鈕。
逐步執行按鈕
Find Button
Find按鈕用於查看當前所選的Selenium命令中當前顯示的頁面上的UI元素(在瀏覽器中)。這在為命令的第一個參數構建定位器時非常有用(請參閱Selenium命令章節中關於定位器的部分)。它可以與任何用於標識網頁上的UI元素的命令一起使用,例如,單擊、單擊、鍵入、以及某些斷言和驗證命令等。
從表視圖中,選擇具有locator參數的任何命令。點擊查找按鈕。現在看一下網頁:應該有一個明亮的綠色矩形包圍着由locator參數指定的元素。
頁面源代碼進行調試(Page Source for Debugging)
通常,在調試測試用例時,您必須查看頁面源(用於測試的網頁的HTML)來確定問題。瀏覽器使你只需右鍵點擊頁面,然后點擊檢查。它將打開瀏覽器的devtools,這很容易讓您瀏覽頁面源代碼。
命令行自動化運行Selenium-IDE導出的side文件【nice!】
要執行side文件需要使用selenium-side-runner工具來使用chromedrive驅動chrome瀏覽器的無界面話來實現.
安裝
這里使用jenkins自動化部署來進行自動化測試
side文件需要selenium-side-runner工具來命令行執行,github地址:https://github.com/SeleniumHQ/selenium-ide/tree/master/packages/selenium-side-runner
需要安裝node,可以參考https://blog.csdn.net/luanpeng825485697/article/details/83420405中node的安裝. 安裝完最新版的node,進入jenkins的容器
sudo npm i -g npm # 使用最新版的npm sudo npm install -g selenium-side-runner # 使用最新版的npm安裝selenium-side-runner
- 1
- 2
添加軟鏈接能在任何地方命令行執行
ln -s /soft/node/bin/selenium-side-runner /usr/local/bin/selenium-side-runner ln -s /soft/node/bin/selenium-side-runner /usr/bin/selenium-side-runner
- 1
- 2
現在谷歌驅動器下載地址:https://chromedriver.storage.googleapis.com/index.html
phantomjs無界面瀏覽器驅動下載地址http://phantomjs.org/download.html
下載后將chromedriver復制到/usr/bin/目錄下面,將phantomjs也復制到/usr/bin/目錄下面
注意:現在selenium已經不支持phantomjs了,chromedrive通過配置"chrome_options.add_argument(’–headless’)"參數也是可以實現無界面化的.
安裝谷歌瀏覽器
現在本地下載好,因為要FQ
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 將上面的deb文件復制到docker中,然后執行 dpkg -i google-chrome*; apt-get -f install
- 1
- 2
安裝chromedrive
wget -c https://chromedriver.storage.googleapis.com/70.0.3538.16/chromedriver_linux64.zip unzip chromedriver_linux64.zip cp chromedriver /usr/bin/ cp chromedriver /usr/local/bin/
- 1
- 2
這樣就可以在side的文件目錄中執行(無界面話的)
# 無界面的谷歌瀏覽器 sudo selenium-side-runner -c "browserName=chrome platform=linux chromeOptions.binary='/opt/google/chrome/chrome' chromeOptions.args=[disable-infobars,no-sandbox,headless]" --base-url http://xxx.xx.xx.xx test.side 或者無界面的phantomjs selenium-side-runner -c "browserName=phantomjs platform=linux" --base-url http://xxx.xx.xx.xx test.side
- 1
- 2
有界面話的
sudo selenium-side-runner -c "browserName=chrome platform=linux chromeOptions.binary='/opt/google/chrome/chrome' chromeOptions.args=[disable-infobars,no-sandbox]" --base-url http://xxx.xx.xx.xx test.side
參考:https://www.cnblogs.com/pungwe/p/10565411.html