關於Python 的 Web 自動化測試的實踐

關於Python 的 Web 自動化測試的實踐

Web 測試是軟體測試中比較重要的一個分支,而要實現 Web 自動化測試則要求測試人員能熟練掌握自動化測試工具和程式語言。介紹免費開源的 Web 測試工具 Selenium,以及流行的程式語言 Python。根據自動化測試的原理,對網頁元素的常用定位方式,如何對頁面元素進行操作進行重點敘述。結合工作實際分析自動化測試的基本流程,即分析測試需求、編寫測試用例、搭建測試環境、建立測試指令碼、執行測試及測試結果分析。最後對自動化測試的實踐進行總結和展望,為後續更好地開展測試工作奠定基礎。

與手工測試類似,自動化測試也需要制定測試計劃,根據軟體需求規格說明書分析測試需求,使用黑盒、白盒等方法設計測試用例,在搭建好測試環境的基礎上使用相關語言編寫自動化指令碼,執行測試並記錄缺陷等。當然在執行自動化指令碼之前也需要進行手工測試,為更好地發現缺陷奠定堅實的基礎。

1 自動化測試技術

1。1測試工具

根據被測軟體的型別不同,可以選擇不同的測試工具。例如針對桌面應用,主流的測試工具有 UTF、Auto Runner 等;如果測試的是 Web 系統,Selenium 則是一種非常不錯的選擇。

Selenium 是一款免費、開源的分散式的自動化測試工具,對商業使用者也沒有任何限制;支援多種平臺,可以在 Windows、Linux、Mac 和 Solaris 等多種作業系統上執行;支援多種瀏覽器,包括 IE、Firefox、Safari、Opera、Chrome 等;使用方便,支援指令碼錄製,可以將測試用例分佈到不同的測試機器上執行;支援多種語言,包括C、Java、Ruby、Python、C#等。

1。2Python語言

Python 是一門優雅而健壯的程式語言,它繼承了傳統編譯語言的強大性和通用性,同時也借鑑了簡單指令碼和解釋語言的易用性。它的特點包括:程式碼簡潔、短小,開源、跨平臺,面向物件,可擴充套件性好等,因此它被應用於資料分析與處理、網路爬蟲、Web 應用開發、人工智慧、自動化測試等多個領域。

在自動化測試領域既可以使用 Python 的標準庫 PyUnit 作為自動化測試框架,也可以使用 Robot Frame⁃work 等自動化測試框架來開展工作,該框架具備良好的可擴充套件性,支援關鍵字驅動,可以同時測試多種型別的客戶端或者介面,可以進行分散式測試執行。

2 網頁元素定位

自動化功能測試工具 Selenium 可以模仿人類對網頁進行自動化的操作,那麼要實現對網頁元素的操作,就要能夠精準地對網頁元素進行定位。可以用於定位的常用的 Web 頁面元素的屬性有:id、name、class name、link text、XPath 和 CSS Selector 等。下面我們重點介紹常用的四種方法。

2。1透過id屬性進行定位

如果 Web 頁面中的 id 不是動態的,則一個頁面的 id 是唯一的。該方法透過查詢 Web 頁面上的元素 id值來獲取元素,但是對於動態分配 Web 元素 id 的情況,這種方法不能使用。

例如:百度首頁搜尋框的原始碼如下:

不難發現其 id 屬性是“kw”,因此可以使用 id 來進行元素定位。driver 表示為建立的一個 webdriver 物件,程式碼為:

element = driver。find_element_by_id(“kw”)

2。2 透過link text屬性進行定位

訪問網頁的時候,我們可以透過超連結的方式連結到下層的網頁或者其他網站,透過查詢網頁的 link text 屬性,模擬對連結文字的單擊操作就可以實現自動地訪問。該定位方法僅適用於文字連結的場景,透過元素標籤對應的文字資訊來定位元素,相對其他的元素定位方法,適用的場景比較有限。

例如百度首頁上方“新聞”文字的 link text 屬性是 “新聞”,可以使用該屬性來進行元素定位。

程式碼為:

element = driver。find_element_by_link_text(“新聞”)

2。3透過XPath屬性進行定位

XPath 是英文 XML Path Language 的簡稱,即 XML 文件路徑的定位語言。XPath 基於 XML 的樹狀結構進行資訊的查詢,它使用路徑表示式定位 XML 文件中的節點或節點集。透過記錄由根節點到該節點經過的所有節點的 tagName 等資訊,可以形成唯一一條到達該節點的路徑表示式。Selenium可以將這種強大的語言應用在 Web 頁面元素的定位中,定位的方式通常有絕對路徑和相對路徑兩種。具體如下:

(1)絕對路徑

絕對路徑表示式以“/”開頭,它從樹形結構的根節點開始,沿著樹結構一直到目標節點結束。當元素層級很深的時候,絕對路徑表示式會過長,閱讀性不好,既影響查詢的效率又很難進行維護,因此一般不建議使用。

(2)相對路徑

相對路徑表示式以“//”開頭,它從某個節點開始,沿著樹結構一直到目標節點結束。目前常用的瀏覽器谷歌、火狐等都提供了 XPath 的工具,可以方便地獲取XPath 路徑。例如百度搜索框的 XPath 屬性可以透過定位到該元素,在該元素的 HTML 程式碼使用快捷選單“Copy-> Copy XPath”獲得 ,其屬值為“//*[@id=“kw”]”。“//”表示當前頁面某個目錄下;“*”是萬用字元,表示匹配任意的節點;“[@id=“kw”]”表示匹配的這個元素的 id 屬性值等於 kw。

2。4透過CSS屬性進行定位

層疊樣式表 CSS 是英文 Cascading Style Sheets 的簡稱,是一種用來表現 HTML 或 XML 等檔案樣式的計算機語言,它也可以透過瀏覽器工具查詢相關元素的CSS,從而進行元素定位。例如百度搜索框的 CSS 屬性可以透過定位到該元素,在該元素的 HTML 程式碼使用快捷選單“Copy -> Copy selector”獲得,其屬性值為#kw。程式碼可以寫成:

element = driver。find_element_by_css_selector(“#kw”)

3 獲取和處理使用者操作

Selenium 庫中有一個 WebDriver 的 API,它能使用 Chrome、Firefox、IE 等瀏覽器進行 Web 測試,模擬使用者開啟瀏覽器,在頁面單擊滑鼠,滑鼠在某個元素上懸停,進行鍵盤各項操作等。Selenium 測試透過模擬使用者在前端的鍵盤滑鼠等操作,觸發前端頁面事件,解析網頁文件獲取相應結果驗證。

3。1滑鼠事件

滑鼠操作除了我們比較熟悉的單擊操作外,還包括右擊、雙擊、懸停和拖動等。在 WebDriver 中,將這些關於滑鼠操作的方法封裝在 ActionChains 類提供。例如,滑鼠懸停的程式碼為:

# 引入ActionChains 類from selenium。webdriver。common。action_chains import Action⁃Chains# 定位元素並懸停above=driver。find_element_by_link_text(“文庫”)

ActionChains(driver)。move_to_element(above)。perform()

3。2鍵盤操作

所有鍵盤中操作的方法由 Keys 類提供,它既可以模擬鍵盤的輸入,也可以模擬鍵盤按鍵,包括組合鍵(例如 Ctrl+N)。模擬百度搜索框中輸入搜尋關鍵字

“Python”的程式碼為:

# 引入 Keys 類from selenium。webdriver。common。keys import Keys# 模擬輸入框輸入內容driver。find_element_by_id(“kw”)。send_keys(“Python”)

3。3元素等待

由於自動化測試的操作速度比人工快許多,加上目前網頁中普遍使用 AJAX 技術,頁面元素可能不是同時被載入,就需要設定合適的等待時間,確保元素正確地被識別。WebDriver 中有兩種型別的等待:顯式等待和隱式等待。

3。4多視窗切換

如果在操作過程中單擊某個連結彈出新視窗後,就需要使用 switch_to。window()方法進行切換,從而確保後續的相關操作能順利進行。

3。5警告框處理

WebDriver 還可以處理由 JavaScript 生成的彈框,方法是使用 switch_to_alert()定位到警告框,然後使用相關方法來進行操作,使用的方法包括:

●text:返回警告框中的文字資訊

●accept:接受當前警告框

●dismiss:解散當前警告框

●send_keys(KeysToSend):傳送文字至當前警 告框

4 自動化測試的實踐

自動化測試的過程大致可以分為:分析測試需求、 編寫測試用例、搭建測試環境、建立測試指令碼、執行測試及測試結果分析等。

4。1 分析測試需求

不論是手工測試還是自動化測試,測試需求都是測試工作開展的首要前提,根據需求確定被測軟體的哪些模組適合開展自動化功能測試。

4。2 編寫測試用例

自動化測試是在手工測試的基礎上進行的,分析各模組的功能特點,根據已有的功能測試用例抽取自動化測試用例,並進行補充和完善,儘量細化到具體的頁面和物件。

4。3搭建測試環境

搭建自動化測試環境首先要下載並安裝 Python, 並且安裝包管理工具 pip;接著需要下載並安裝 Python的 Selenium 包,並且驗證安裝是否成功;最後需要下載瀏覽器的驅動,並放置在 Python 安裝目錄的根目錄下。需要特別注意的是:瀏覽器、Selenium 版本以及瀏覽器驅動的匹配,否則瀏覽器將無法正常啟動。下面在 Python 自帶的 IDLE 環境中,以啟動谷歌瀏覽器為例來驗證環境是否搭建成功。程式碼如下:

from selenium import webdriver #匯入 webdriver 模組driver = webdriver。Chrome()

driver。get(“https://www。baidu。com”)

執行程式後,如果可以自動啟動谷歌瀏覽器並訪 問“百度”首頁,就表示環境搭建成功

4。4建立測試指令碼

對於較大的系統測試,可以透過對 Selenium 進行二次封裝搭建測試框架,提高對頁面元素的視覺化程度,從而提高測試指令碼的編寫效率。測試框架應該是由待測系統功能抽離出的共用部分來構建而成的,不能依賴於具體的應用系統,即測試框架與待測系統儘量是低耦合的,這樣可以使測試框架具有較高的可複用性。為了減少指令碼的冗餘,降低指令碼的維護成本,可以將測試程式中一致的、共同的指令碼提取出來,作為類和介面供其他指令碼進行呼叫。

自動化測試指令碼主要圍繞業務流程展開,即由頁面元素、業務邏輯、測試資料等組成,測試資料既可以存放在 Excel 表中,也可以存放在 MySQL 等資料庫中。下面以某論壇系統的註冊功能為例,程式碼如下:

from selenium import webdriverimport time

driver = webdriver。Chrome()

driver。get(“http://172。21。1。7:8081/bbs/”)

driver。find_element_by_link_text(“register”)。click(); #跳轉至 註冊頁面time。sleep(2)#停頓 2 秒driver。find_element_by_name(“userName”)。send_keys(“wull”)#輸入使用者名稱driver。find_element_by_name

(“password”)。send_keys (“wull123”)#輸入密碼driver。find_element_by_name

(“passconfirm”)。send_keys

(“wull123”)#輸入確認密碼driver。find_element_by_xpath

(“//select[@name=‘sex’]”)

send_keys(“female”)#輸入性別#輸入電話driver。find_element_by_xpath

(“//input[@name=‘phone’]”)

send_keys(“13812345678”)#輸入電郵driver。find_element_by_xpath

(“//input[@name=‘email’]”)

send_keys(“12345678@qq。com”)

driver。find_element_by_id(“submit”)。click()#提交註冊資訊driver。switch_to_alert()。accept()

4。5 執行測試及測試結果分析

測試指令碼是以。py 為字尾的檔案,如果需要執行之後生成測試報告,需要安裝並呼叫 Unittest 的第三方庫HTMLTestRunner,執行程式碼後生成的測試報告是 HT⁃ML 格式的,可以根據測試報告對測試的結果進行分析。

5 結語

基於 Selenium+Python 的自動化測試應用可以減少人工多次的驗證活動,降低測試的成本,從而較大幅度地提高軟體測試的效率,保證軟體產品的質量。後期可以進一步最佳化自動化測試框架,提高控制元件視覺化識別的效率,加快元素定位的效率,並且加強測試用例的管理。