1. 程式人生 > 其它 >robot_framewok自動化測試--(8)SeleniumLibrary 庫(selenium、元素定位、關鍵字和分層設計)

robot_framewok自動化測試--(8)SeleniumLibrary 庫(selenium、元素定位、關鍵字和分層設計)

SeleniumLibrary 庫

一、selenium

1.1、Selenium 介紹

  Selenium 自動化測試工具,它主要是用於 Web 應用程式的自動化測試,但並不只侷限於此,同時支援所有基於 web 的管理任務自動化。   Selenium 的特點:
  • 開源,免費
  • 多瀏覽器支援:FireFox、Chrome、IE、Opera
  • 多平臺支援:linux 、windows、MAC
  • 多語言支援:java、Python、Ruby、php、C#、JavaScript
  • 對 web 頁面有良好的支援
  • 簡單(API 簡單)、靈活(用開發語言驅動)
  • 支援分散式測試用例執行
  Selenium 是支援多種開發語言的,對於不同的語言來說都有其對應的庫。

2.2、安裝 SeleniumLibrary

>pip install robotframework-seleniumlibrary
在前面內容中已經知道了如何新增庫,現在我們將“SeleniumLibrary”庫新增到相應的測試套件中。   新增完成,黑色示新增的庫正常,紅色表示庫不存。如果為紅色,請檢查site-packages 目錄下是否有 Selenium2Library 目錄

1.3第一個例子

  我們已經有了學習 Robot Framework 的經驗,通過按 F5 快捷鍵來查詢庫所提供的關鍵字。

  如上圖,自動化指令碼從開啟瀏覽器開如,我想開啟一個瀏覽器,自然想到的是以“open”為關鍵字進行搜尋,結果找到了一個“Open Browser”的關鍵字,點選這個關鍵字,顯示它的用法和說明。  

  根據說明,我們來嘗試建立這個開啟瀏覽器的操作吧,這裡跟新著我們寫一個 web 自動化測試用例(百度搜索用例):

執行結果:

Starting test: Test Project.Test Suit.baidu_search
20211107 22:53:51.920 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211107 22:53:51.921 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE0vzfcxc0.d\geckodriver-3.log
20211107 22:54:00.407 : INFO : Typing text 'robotframeworkѧϰ' into text field 'id=kw'. 20211107 22:54:00.632 : INFO : Clicking button 'id=su'. 20211107 22:54:05.906 : INFO : Slept 5 seconds Ending test: Test Project.Test Suit.baidu_search

二、元素定位

  對於 Web 自動化測試來說,就是操作頁面上的各種元素,在操作元素之間需要先找到元素,換句話說就是定位元素。   SeleniumLibrary 提供了非常豐富的定位器:

  雖提供了這麼多種定位方式,並不是要求我們每一種都要學會。在這裡我只介紹 4 種定位方式,id、name、xpath 和 css。介紹 id 和 name,是因為這兩種定位方式非常簡單且實用,介紹 xpath 和 css,是因為這兩種定位方式足夠強大,可以滿足幾乎所有定位需求。

2.1前端工具

  在學習定位之前,有必要先介紹一下瀏覽器的前端具。   firefox 瀏覽器可以通過 firebug 工具查檢視頁面元素。

2.2 id 和 name 定位

  假如把一個元素看作一個人的話,id 和 name 可以看作一個人的身份證號和姓名。當然,這些屬性值是否唯一要看前端工程師如何設計了。

  根據上面的例子,百度輸入框可以取 id 或 name 進行定位。(前提是 id 和 name 的值在當頁面上唯一)   id = kw1   name = wd   在 Robot framework 中就是這樣寫的:

  Input text 用於輸入框的關鍵字,“robot framework 學習”是要給輸入框輸入的內容。

  百度按鈕只 id 資料可以利用:   id=su

  Click Button 是按鈕點選的關鍵字。

2.3xpath 定位

  XPath 是一種在 XML 文件中定位元素的語言。因為 HTML 可以看做 XML 的一種實現,所以 selenium使用者可是使用這種強大語言在 web 應用中定位元素。   假如,一個人沒身份證號沒名字怎麼找呢?想想你是怎麼找朋友吃飯的,他手機不通,電話不回呢?直接上他家去唄,那你一定有他家住址,xx 市 xx 區 xx 路 xx 號。xpath 就可以通過這種層級關係找到元素。 

(1)xpath 的絕對路徑:

  xpath = /html/body/div[1]/div[4]/div[2]/div/form/span[1]/input

  我們可以從最外層開始找,html 下面的 body 下面的 div 下面的第 4 個 div 下面的....input 標籤。通過一級一級的鎖定就找到了想要的元素。

(2)xpath 的相對路徑:

  絕對路徑的用法往往是在我們迫不得已的時候才用的。大多時候用相對路徑更簡便。
  •  元素本身:
Xpath 同樣可以利用元素自身的屬性: Xpath = //*[@id=’kw1’] //表示某個層級下,*表示某個標籤名。@id=kw1 表示這個元素有個 id 等於 kw1 。 當然,一般也可以制定標籤名: Xpath = //input[@id=’kw1’] 元素本身,可以利用的屬性就不只侷限為於 id 和 name ,如: Xpath = //input[@type=’text’] Xpath = //input[@autocomplete=’off’] 但要保證這些元素可以唯一的識別一個元素。
  •   找上級:
  當我們要找的一個人是個剛出生的嬰兒,還沒起名子也沒有入戶口(身份證號),但是你會永遠跟在你父親的身邊,你的父親是有唯一的名字和身份證號的,這樣我們可以先找到你父親,自然就找到你的。   元素的上級屬性為:
<form id="form1" class="fm" action="/s" name="f1">
<span class="bg s_ipt_wr">
  <input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd" utocomplete="off">
  找爸爸:   xpath = //span[@class=’bg s_ipt_w’]/input   如果爸爸沒有唯一的屬性,可以找爺爺:   xpath = //form[@id=’form1’]/span/input   這樣一級一級找上去,直到 html ,那麼就是一個絕對路徑了。
  •   布林值寫法:
  如果一個人的姓名不是唯一的,身份證號也不是唯一的,但是同時叫張三 並且 身份證號為 123 的人卻可以唯一的確定一個人。那麼可以這樣寫:   Xpath = //input[@id=’kw1’ and @name=’wd’]   可以 and ,當然也可以 or :   Xpath = //input[@id=’kw1’ or @name=’wd’]   但 or 的實際意義不太。我們一般不需要說,找的人名字或者叫張三,或者身份證號是 123 也可以      Robot framework 中的寫法:

2.4css 定位

  CSS(Cascading Style Sheets)是一種語言,它被用來描述 HTML 和 XML 文件的表現。CSS 使用選擇器來為頁面元素繫結屬性。這些選擇器可以被 selenium 用作另外的定位策略。   CSS 可以比較靈活選擇控制元件的任意屬性,一般情況下定位速度要比 XPath 快,但對於初學者來說比較難以學習使用,下面我們就詳細的介紹 CSS 的語法與使用。   CSS 選擇器的常見語法:
  • 通過 class 屬性定位:
css=.s_ipt css=.bg s_btn csscss_selector()方法用於 CSS 語言定位元素,點號(.)表示通過 class 屬性來定位元素。
  • 通過 id 屬性定位:
css=#kw css=#su 井號(#)表示通過 id 屬性來定位元素。
  • 通過標籤名定位:
css=input 在 CSS 語言中用標籤名定位元素不需要任何符號標識,直接使用標籤名即可,但我們前面已經瞭解到標籤名重複的概率非常大,所以通過這種方式很難唯一的標識一個元素。
  • 通過父子關係定位:
css=span>input 上面的寫法表示有父親元素,它的標籤名叫 span,查詢它的所有標籤名叫 input 的子元素。
  • 通過屬性定位:
css=input[autocomplete='off'] css=input[maxlength='100'] css=input[type='submit'] 在 CSS 當中也可以使用元素的任意屬性,只要這些屬性可以唯一的標識這個元素。
  • 組合定位:
我們當然可以把上面的定位策略組合起來使用,這樣就大大加強了元素的唯一性。 css=span.bg s_ipt_wr>input.s_ipt css=span.bg s_btn_wr>input#su 有一個父元素,它的標籤名叫 span,它有一個 class 屬性值叫 bg s_ipt_wr,它有一個子元素,標籤名叫 input,並且這個子元素的 class 屬性值叫 s_ipt。好吧!我們要找的就是具有這麼多特徵的一個子元素。

Robot framework 中的寫法:

三、SeleniumLibrary 關鍵字

關於 Selenium2Library 的關鍵字,我們可以參考通過 F5查詢 Selenium2Library 關鍵字型檔:

3.1瀏覽器驅動

通過不同的瀏覽器執行腳

瀏覽器對應的關鍵字:

open browser 同樣也可以開啟本地 html 頁面,如:

備註:

  • 要想通過不同的瀏覽開啟 URL 地址,一定要安裝瀏覽器相對應的驅動。
  • chrome 的驅動為:chromedriver.exe 。
  • IE 的驅動為:IEDriverServer.exe
  • 瀏覽器預設為空時啟動 FireFox。

3.2 關閉瀏覽器

close browser 關閉當前的瀏覽器。close all browser 關鍵所有開啟的瀏覽器和快取重置

3.3 瀏覽器最大化

Maximize Browser Window 關鍵字使當前開啟的瀏覽器全屏。

3.4 設定瀏覽器視窗寬、高

get windows size 關鍵字用於打設定開啟瀏覽器的寬度和高度。以畫素為單位,第一個引數 800 表示寬 度,第二個引數 600 表示高度

測試結果:

Starting test: Test Project.Test Suit.baidu_search
20211108 13:51:33.456 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211108 13:51:33.457 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE_x45edr9.d\geckodriver-2.log
20211108 13:51:41.610 :  INFO : Typing text 'robotframeworkѧϰ' into text field 'id=kw'.
20211108 13:51:42.123 :  INFO : Clicking button 'id=su'.
20211108 13:51:42.465 :  INFO : ${width} = 1295
20211108 13:51:42.465 :  INFO : ${height} = 695
20211108 13:51:42.466 :  INFO : 1295
20211108 13:51:42.467 :  INFO : 695
20211108 13:51:47.474 :  INFO : Slept 5 seconds
Ending test:   Test Project.Test Suit.baidu_search

3.5 文字輸入

input text 關鍵字用於向文字框內輸入內容。

xpath=//* [@] :表示元素定位,定位文字輸入框。

3.6 點選元素

  Click Element 關鍵字用於點選頁面上的元素,單擊任何可以點選按鈕、文字/圖片連線、複選框、單選 框、甚至是下拉框等。   xpath=//* [@] :表示元素定位,定位點選的元素。

3.7 點選按鈕

ClickButton關鍵字用於點選頁面上的按鈕。

Xpath=//* [@] :表示元素定位,定位點選的按鈕。

3.8 等待元素出現

Wait Until Page Contains Element 關鍵字用於等待頁面上的元素顯示出來。 Xpath=//* [@] :表示元素定位,這裡定位出現的元素 42 : 表示最長等待時間。 Error : 表示錯誤提示,自定義錯誤提示,如:“元素不能正常顯示”

測試結果:

Starting test: Test Project.Test Suit.baidu_search
20211108 14:00:30.027 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211108 14:00:30.028 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE_x45edr9.d\geckodriver-3.log
20211108 14:00:38.176 :  INFO : Typing text 'robotframeworkѧϰ' into text field 'id=kw'.
20211108 14:00:38.519 :  INFO : Clicking button 'id=su'.
20211108 14:00:38.867 :  INFO : ${width} = 1295
20211108 14:00:38.867 :  INFO : ${height} = 695
20211108 14:00:38.868 :  INFO : 1295
20211108 14:00:38.869 :  INFO : 695
20211108 14:00:43.879 :  INFO : Slept 5 seconds
Ending test:   Test Project.Test Suit.baidu_search

3.9 獲取title

get title 關鍵字用於獲得當前瀏覽器視窗的 title 資訊。 這裡只獲取 title 是沒有意義的,我們通常會將獲取的 title 傳遞給一個變數,然後與預期結果進行比較。從而判斷當前指令碼執行成功。

執行結果:

Starting test: Test Project.Test Suit.baidu_search
20211108 14:22:12.707 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211108 14:22:12.710 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE_x45edr9.d\geckodriver-9.log
20211108 14:22:20.330 :  INFO : Typing text 'robotframeworkѧϰ' into text field 'id=kw'.
20211108 14:22:20.718 :  INFO : Clicking button 'id=su'.
20211108 14:22:21.052 :  INFO : ${a} = 百度一下,你就知道
20211108 14:22:21.053 :  INFO : 百度一下,你就知道
20211108 14:22:21.055 :  INFO : ${width} = 1295
20211108 14:22:21.056 :  INFO : ${height} = 695
20211108 14:22:21.056 :  INFO : 1295
20211108 14:22:21.057 :  INFO : 695
20211108 14:22:26.065 :  INFO : Slept 5 seconds
Ending test:   Test Project.Test Suit.baidu_search

3.10 獲取text

get text 關鍵字用於獲取元素的文字資訊。 xpath=//* [@] : 定位文字資訊的元素。

3.11獲取元素屬性值

  id=kw@name:id=kw 表示定位的元素。@nam 獲取這個元素的 name 屬性值。

  

  3.12cookei 處理

  •   get cookies 獲得當前瀏覽器的所有 cookie 。
  •   get cookie value 獲得 cookie 值。key_name 表示一對 cookie 中 key 的 name 。
  •   add cookie 新增 cookie。新增一對 cooke (key:value)
  •   delete cookie 刪除 cookie。刪除 key 為 name 的 cookie 資訊。
  •   delete all cookies 刪除當前瀏覽器的所有 cookies。

  

  3.13 驗證

  獲得瀏覽器 title 進行比較。

  •   Open Browser 通過 chrome 開啟百度首頁。
  •   Get Title 獲得瀏覽器視窗的 titile ,並賦值給變數${title}
  •   Should Contain 比較${title}是否等於“百度一下,你就知道”。

  

  測試結果:

Starting test: Test Project.Test Suit.baidu_search
20211108 14:52:20.175 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211108 14:52:20.176 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE_x45edr9.d\geckodriver-11.log
20211108 14:52:27.393 :  INFO : ${title} = 百度一下,你就知道
20211108 14:52:27.426 :  INFO : Typing text 'robotframework學習' into text field 'id=kw'.
20211108 14:52:27.842 :  INFO : Clicking button 'id=su'.
20211108 14:52:29.741 :  INFO : ${a} = robotframework學習_百度搜索
20211108 14:52:29.742 :  INFO : robotframework學習_百度搜索
20211108 14:52:29.745 :  INFO : ${width} = 1295
20211108 14:52:29.745 :  INFO : ${height} = 695
20211108 14:52:29.746 :  INFO : 1295
20211108 14:52:29.747 :  INFO : 695
20211108 14:52:31.760 :  INFO : Slept 2 seconds
Ending test:   Test Project.Test Suit.baidu_search
獲得文字資訊進行比較

測試結果:

Starting test: Test Project.Test Suit.baidu_search
20211108 15:17:03.377 :  INFO : Opening browser 'firefox' to base url 'https://www.baidu.com'.
20211108 15:17:03.379 :  INFO : Firefox driver log is always forced to to: C:\Users\yzp\AppData\Local\Temp\RIDE_x45edr9.d\geckodriver-17.log
20211108 15:17:10.732 :  INFO : ${title} = 百度一下,你就知道
20211108 15:17:10.754 :  INFO : Typing text 'robotframework學習' into text field 'id=kw'.
20211108 15:17:11.217 :  INFO : Clicking button 'id=su'.
20211108 15:17:19.166 :  INFO : Slept 5 seconds
20211108 15:17:19.189 :  INFO : ${text} = 幫助
20211108 15:17:19.194 :  INFO : ${width} = 1295
20211108 15:17:19.194 :  INFO : ${height} = 695
20211108 15:17:19.195 :  INFO : 1295
20211108 15:17:19.205 :  INFO : 695
20211108 15:17:21.209 :  INFO : Slept 2 seconds
Ending test:   Test Project.Test Suit.baidu_search

3.14表單巢狀

有時候和頁面中會出現表單巢狀,這個時候需要進入到表單才能操作相關元素。

Select Frame 進入表單,Xpath=//* [@] 表示定位要進入的表單。

Unselect Frame 退出表單。

3.15下拉框選擇

Unselect From List By Value 關鍵字用天選擇下拉框。 Xpath=//* [@] 定位下拉框; Vlaue 選擇下拉框裡的屬性值。

3.16 執行 JavaScript

在一些特殊的情況下需要呼叫 JavaScript 程式碼。

Execute Javascript 關鍵字用於使用 JavaScript 程式碼

四、Robot Framework 分層設計

  談到 Robot Framework 分層的思想,就不得不提“關鍵字驅動”。   回到分層的思想上,在程式設計的講究設計模式,設計模式其實就是根據需求使用抽象與封裝,其實就是分層思想。把一個實現過程分成不同多層。提高的靈活性,從而達到可擴充套件性和可維護性。   再回到自動化的話題上,我們可以把操作步驟封裝一個一個的方法(關鍵字),通過呼叫關鍵字來實現測試用例。   參考前面建立的一條百度搜索的測試用例。

1、建立資源

右鍵“測試專案”選擇“new resource”建立資源。

2、建立關鍵字

右鍵“業務關鍵字”選擇“new User Keyword” 來建立使用者關鍵字 輸入關鍵字的名稱:

3、編輯關鍵字

分析:

  對於一個測試用例來說,使用者關心的是輸入什麼內容,得到什麼結果。   所以,對於“百度搜索”關鍵字來說,需要建立兩個介面變數${search}和${result} 兩個變數,用於接收輸入內容和預期結果。   點選 Arguments 輸入框,定義變數,多個變數從用“|”隔開。   在百度使用者中使用引數化變數。

4、新增建立的資源

切換到測試套件(Search)頁面,新增資源(業務關鍵字.txt)

5、呼叫關鍵字

現在就可以在測試用例中使用建立的關鍵字了(百度搜索)。

  對於每一條用例來說,呼叫“百度搜索”關鍵字,輸入搜尋內容,輸入預期結果即可。不同關心用例是如何執行的。如果百度輸入框的定位發生了變化,只用去修改“百度搜索”關鍵字即可,不用對每一條用例做任何修改。大大提高的用例的維護性和擴充套件性。

  繼續分層的設計:

到此,Robot Framework +Selenium 自動化測試粗獷的講完了。當然還有更多 API 的使用,和細枝末節的設定沒有介紹。但我們已經可以拿它來開展自動化工作了。

本部落格所有文章僅用於學習、研究和交流目的,歡迎非商業性質轉載。

本文來自部落格園,作者:hello_殷,轉載請註明原文連結:https://www.cnblogs.com/yinzuopu/p/15522285.html

本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。