關(guān)于Python 的 Web 自動化測試的實踐

Web 測試是軟件測試中比較重要的一個分支,而要實現(xiàn) Web 自動化測試則要求測試人員能熟練掌握自動化測試工具和編程語言钙勃。介紹免費開源的 Web 測試工具 Selenium,以及流行的編程語言 Python慈参。根據(jù)自動化測試的原理玩讳,對網(wǎng)頁元素的常用定位方式趋观,如何對頁面元素進行操作進行重點敘述扛禽。結(jié)合工作實際分析自動化測試的基本流程,即分析測試需求皱坛、編寫測試用例编曼、搭建測試環(huán)境、創(chuàng)建測試腳本剩辟、執(zhí)行測試及測試結(jié)果分析掐场。最后對自動化測試的實踐進行總結(jié)和展望,為后續(xù)更好地開展測試工作奠定基礎(chǔ)贩猎。

與手工測試類似熊户,自動化測試也需要制定測試計劃,根據(jù)軟件需求規(guī)格說明書分析測試需求吭服,使用黑盒嚷堡、白盒等方法設(shè)計測試用例,在搭建好測試環(huán)境的基礎(chǔ)上使用相關(guān)語言編寫自動化腳本艇棕,執(zhí)行測試并記錄缺陷等蝌戒。當然在執(zhí)行自動化腳本之前也需要進行手工測試,為更好地發(fā)現(xiàn)缺陷奠定堅實的基礎(chǔ)沼琉。

1 自動化測試技術(shù)

1.1測試工具

根據(jù)被測軟件的類型不同北苟,可以選擇不同的測試工具。例如針對桌面應(yīng)用打瘪,主流的測試工具有 UTF友鼻、Auto Runner 等;如果測試的是 Web 系統(tǒng)闺骚,Selenium 則是一種非常不錯的選擇彩扔。

Selenium 是一款免費、開源的分布式的自動化測試工具僻爽,對商業(yè)用戶也沒有任何限制虫碉;支持多種平臺,可以在 Windows进泼、Linux蔗衡、Mac 和 Solaris 等多種操作系統(tǒng)上運行;支持多種瀏覽器乳绕,包括 IE绞惦、Firefox、Safari洋措、Opera济蝉、Chrome 等;使用方便,支持腳本錄制王滤,可以將測試用例分布到不同的測試機器上執(zhí)行贺嫂;支持多種語言,包括C雁乡、Java第喳、Ruby、Python踱稍、C#等曲饱。

1.2Python語言

Python 是一門優(yōu)雅而健壯的編程語言,它繼承了傳統(tǒng)編譯語言的強大性和通用性珠月,同時也借鑒了簡單腳本和解釋語言的易用性扩淀。它的特點包括:代碼簡潔、短小啤挎,開源驻谆、跨平臺,面向?qū)ο笄炱福蓴U展性好等胜臊,因此它被應(yīng)用于數(shù)據(jù)分析與處理、網(wǎng)絡(luò)爬蟲掏觉、Web 應(yīng)用開發(fā)区端、人工智能值漫、自動化測試等多個領(lǐng)域澳腹。

在自動化測試領(lǐng)域既可以使用 Python 的標準庫 PyUnit 作為自動化測試框架,也可以使用 Robot Frame?work 等自動化測試框架來開展工作杨何,該框架具備良好的可擴展性酱塔,支持關(guān)鍵字驅(qū)動,可以同時測試多種類型的客戶端或者接口危虱,可以進行分布式測試執(zhí)行羊娃。

2 網(wǎng)頁元素定位

自動化功能測試工具 Selenium 可以模仿人類對網(wǎng)頁進行自動化的操作,那么要實現(xiàn)對網(wǎng)頁元素的操作埃跷,就要能夠精準地對網(wǎng)頁元素進行定位蕊玷。可以用于定位的常用的 Web 頁面元素的屬性有:id弥雹、name垃帅、class name、link text剪勿、XPath 和 CSS Selector 等贸诚。下面我們重點介紹常用的四種方法。

2.1通過id屬性進行定位

如果 Web 頁面中的 id 不是動態(tài)的,則一個頁面的 id 是唯一的酱固。該方法通過查找 Web 頁面上的元素 id值來獲取元素械念,但是對于動態(tài)分配 Web 元素 id 的情況,這種方法不能使用运悲。

例如:百度首頁搜索框的源代碼如下:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

不難發(fā)現(xiàn)其 id 屬性是“kw”龄减,因此可以使用 id 來進行元素定位。driver 表示為創(chuàng)建的一個 webdriver 對象班眯,代碼為:

element = driver.find_element_by_id("kw")

2.2 通過link text屬性進行定位

訪問網(wǎng)頁的時候欺殿,我們可以通過超鏈接的方式鏈接到下層的網(wǎng)頁或者其他網(wǎng)站,通過查找網(wǎng)頁的 link text 屬性鳖敷,模擬對鏈接文本的單擊操作就可以實現(xiàn)自動地訪問脖苏。該定位方法僅適用于文本鏈接的場景,通過元素標簽對應(yīng)的文本信息來定位元素定踱,相對其他的元素定位方法棍潘,適用的場景比較有限。

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

代碼為:

element = driver.find_element_by_link_text("新聞")

2.3通過XPath屬性進行定位

XPath 是英文 XML Path Language 的簡稱,即 XML 文檔路徑的定位語言畅哑。XPath 基于 XML 的樹狀結(jié)構(gòu)進行信息的查找肴楷,它使用路徑表達式定位 XML 文檔中的節(jié)點或節(jié)點集。通過記錄由根節(jié)點到該節(jié)點經(jīng)過的所有節(jié)點的 tagName 等信息荠呐,可以形成唯一一條到達該節(jié)點的路徑表達式赛蔫。Selenium可以將這種強大的語言應(yīng)用在 Web 頁面元素的定位中,定位的方式通常有絕對路徑和相對路徑兩種泥张。具體如下:

(1)絕對路徑

絕對路徑表達式以“/”開頭呵恢,它從樹形結(jié)構(gòu)的根節(jié)點開始,沿著樹結(jié)構(gòu)一直到目標節(jié)點結(jié)束媚创。當元素層級很深的時候渗钉,絕對路徑表達式會過長,閱讀性不好钞钙,既影響查找的效率又很難進行維護,因此一般不建議使用芒炼。

(2)相對路徑

相對路徑表達式以“//”開頭,它從某個節(jié)點開始宝磨,沿著樹結(jié)構(gòu)一直到目標節(jié)點結(jié)束弧关。目前常用的瀏覽器谷歌、火狐等都提供了 XPath 的工具世囊,可以方便地獲取XPath 路徑窿祥。例如百度搜索框的 XPath 屬性可以通過定位到該元素株憾,在該元素的 HTML 代碼使用快捷菜單“Copy-> Copy XPath”獲得 ,其屬值為“//*[@id="kw"]”晒衩∴拖梗“//”表示當前頁面某個目錄下听系;“*”是通配符,表示匹配任意的節(jié)點靠胜;“[@id="kw"]”表示匹配的這個元素的 id 屬性值等于 kw。

2.4通過CSS屬性進行定位

層疊樣式表 CSS 是英文 Cascading Style Sheets 的簡稱陕习,是一種用來表現(xiàn) HTML 或 XML 等文件樣式的計算機語言址愿,它也可以通過瀏覽器工具查詢相關(guān)元素的CSS,從而進行元素定位响谓。例如百度搜索框的 CSS 屬性可以通過定位到該元素,在該元素的 HTML 代碼使用快捷菜單“Copy -> Copy selector”獲得塌忽,其屬性值為#kw失驶。代碼可以寫成:

element = driver.find_element_by_css_selector("#kw")

3 獲取和處理用戶操作

Selenium 庫中有一個 WebDriver 的 API枣购,它能使用 Chrome、Firefox涩堤、IE 等瀏覽器進行 Web 測試分瘾,模擬用戶打開瀏覽器,在頁面單擊鼠標,鼠標在某個元素上懸停汽纤,進行鍵盤各項操作等福荸。Selenium 測試通過模擬用戶在前端的鍵盤鼠標等操作,觸發(fā)前端頁面事件背传,解析網(wǎng)頁文檔獲取相應(yīng)結(jié)果驗證台夺。

3.1鼠標事件

鼠標操作除了我們比較熟悉的單擊操作外,還包括右擊颤介、雙擊、懸停和拖動等买窟。在 WebDriver 中,將這些關(guān)于鼠標操作的方法封裝在 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)绢掰。模擬百度搜索框中輸入搜索關(guān)鍵字

“Python”的代碼為:

# 引入 Keys 類

from selenium.webdriver.common.keys import Keys

# 模擬輸入框輸入內(nèi)容

driver.find_element_by_id("kw").send_keys("Python")

3.3元素等待

由于自動化測試的操作速度比人工快許多童擎,加上目前網(wǎng)頁中普遍使用 AJAX 技術(shù),頁面元素可能不是同時被加載班挖,就需要設(shè)置合適的等待時間芯砸,確保元素正確地被識別给梅。WebDriver 中有兩種類型的等待:顯式等待和隱式等待双揪。

3.4多窗口切換

如果在操作過程中單擊某個鏈接彈出新窗口后,就需要使用 switch_to.window()方法進行切換曹质,從而確保后續(xù)的相關(guān)操作能順利進行擎场。

3.5警告框處理

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

●text:返回警告框中的文字信息

●accept:接受當前警告框

●dismiss:解散當前警告框

●send_keys(KeysToSend):發(fā)送文本至當前警 告框

4 自動化測試的實踐

自動化測試的過程大致可以分為:分析測試需求姨夹、 編寫測試用例矾策、搭建測試環(huán)境、創(chuàng)建測試腳本逃糟、執(zhí)行測試及測試結(jié)果分析等蓬豁。

4.1 分析測試需求

不論是手工測試還是自動化測試,測試需求都是測試工作開展的首要前提取募,根據(jù)需求確定被測軟件的哪些模塊適合開展自動化功能測試蟆技。

4.2 編寫測試用例

自動化測試是在手工測試的基礎(chǔ)上進行的,分析各模塊的功能特點聊品,根據(jù)已有的功能測試用例抽取自動化測試用例几苍,并進行補充和完善陈哑,盡量細化到具體的頁面和對象伸眶。

4.3搭建測試環(huán)境

搭建自動化測試環(huán)境首先要下載并安裝 Python刽宪, 并且安裝包管理工具 pip;接著需要下載并安裝 Python的 Selenium 包嘴秸,并且驗證安裝是否成功庇谆;最后需要下載瀏覽器的驅(qū)動,并放置在 Python 安裝目錄的根目錄下串述。需要特別注意的是:瀏覽器寞肖、Selenium 版本以及瀏覽器驅(qū)動的匹配,否則瀏覽器將無法正常啟動新蟆。下面在 Python 自帶的 IDLE 環(huán)境中琼稻,以啟動谷歌瀏覽器為例來驗證環(huán)境是否搭建成功。代碼如下:

from selenium import webdriver #導入 webdriver 模塊

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

執(zhí)行程序后欣簇,如果可以自動啟動谷歌瀏覽器并訪 問“百度”首頁,就表示環(huán)境搭建成功

4.4創(chuàng)建測試腳本

對于較大的系統(tǒng)測試莫鸭,可以通過對 Selenium 進行二次封裝搭建測試框架横殴,提高對頁面元素的可視化程度,從而提高測試腳本的編寫效率梨与。測試框架應(yīng)該是由待測系統(tǒng)功能抽離出的共用部分來構(gòu)建而成的文狱,不能依賴于具體的應(yīng)用系統(tǒng),即測試框架與待測系統(tǒng)盡量是低耦合的呻粹,這樣可以使測試框架具有較高的可復(fù)用性。為了減少腳本的冗余腮郊,降低腳本的維護成本筹燕,可以將測試程序中一致的、共同的腳本提取出來撒踪,作為類和接口供其他腳本進行調(diào)用。

自動化測試腳本主要圍繞業(yè)務(wù)流程展開援奢,即由頁面元素忍捡、業(yè)務(wù)邏輯、測試數(shù)據(jù)等組成具篇,測試數(shù)據(jù)既可以存放在 Excel 表中凌埂,也可以存放在 MySQL 等數(shù)據(jù)庫中。下面以某論壇系統(tǒng)的注冊功能為例埃疫,代碼如下:

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.get("http://172.21.1.7:8081/bbs/")

driver.find_element_by_link_text("register").click(); #跳轉(zhuǎn)至 注冊頁面

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

("http://select[@name='sex']")

.

send_keys("female")#輸入性別

#輸入電話

driver.find_element_by_xpath

("http://input[@name='phone']")

.

send_keys(

"13812345678")

#輸入電郵

driver.find_element_by_xpath

("http://input[@name='email']")

.

send_keys(

"12345678@qq.com")

driver.find_element_by_id("submit").click()#提交注冊信息

driver.switch_to_alert().accept()

4.5 執(zhí)行測試及測試結(jié)果分析

測試腳本是以.py 為后綴的文件孩哑,如果需要執(zhí)行之后生成測試報告横蜒,需要安裝并調(diào)用 Unittest 的第三方庫HTMLTestRunner,運行代碼后生成的測試報告是 HT?ML 格式的丛晌,可以根據(jù)測試報告對測試的結(jié)果進行分析澎蛛。

5 結(jié)語

基于 Selenium+Python 的自動化測試應(yīng)用可以減少人工多次的驗證活動,降低測試的成本,從而較大幅度地提高軟件測試的效率渠羞,保證軟件產(chǎn)品的質(zhì)量智哀。后期可以進一步優(yōu)化自動化測試框架荧恍,提高控件可視化識別的效率,加快元素定位的效率摹菠,并且加強測試用例的管理骗爆。

看了這篇內(nèi)容后,堅信以下兩件事煮寡,也會對你的自我提升有一定的幫助:

1犀呼、點贊,讓更多人能看到外臂,同時你的認可也會鼓勵我創(chuàng)作更多優(yōu)質(zhì)內(nèi)容宋光。

2、要讓自己變得更強:想想罪佳,假如你是要在測試這個行業(yè)長期做下去,你的工作經(jīng)驗和測試技術(shù)是絕對不夠的尽楔,你需要提升第练,你需要豐富你的技術(shù)棧!還等什么呕寝!

最后:【可能給你帶來幫助的教程】

點擊免費領(lǐng)取軟件測試資料 100+ 名企測試內(nèi)推資源傾情分享婴梧,我的學習基地

這一些資料,對做【軟件測試】的朋友而言應(yīng)該是較為完整了孽江,這類學習資料也陪伴我走過了最艱難的路程,希望也可以幫助到你辆琅!萬事要盡早这刷,尤其是技術(shù)行業(yè),一定要提升技術(shù)功底似袁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昙衅,一起剝皮案震驚了整個濱河市所宰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仔粥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谭羔,死亡現(xiàn)場離奇詭異瘟裸,居然都是意外死亡诵竭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門沙郭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裳朋,“玉大人,你說我怎么就攤上這事送挑。” “怎么了惕耕?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵赡突,是天一觀的道長区赵。 經(jīng)常有香客問我,道長漱受,這世上最難降的妖魔是什么骡送? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任摔踱,我火速辦了婚禮,結(jié)果婚禮上派敷,老公的妹妹穿的比我還像新娘。我一直安慰自己腐芍,他們只是感情好试躏,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布颠蕴。 她就那樣靜靜地躺著,像睡著了一般犀被。 火紅的嫁衣襯著肌膚如雪弱判。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天开伏,我揣著相機與錄音,去河邊找鬼固灵。 笑死巫玻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仍秤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凰浮,長吁一口氣:“原來是場噩夢啊……” “哼袜茧!你這毒婦竟也來了瓣窄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤裳凸,失蹤者是張志新(化名)和其女友劉穎啥么,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菠秒,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡氯迂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年嚼蚀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿曙。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖穿铆,靈堂內(nèi)的尸體忽然破棺而出斋荞,到底是詐尸還是另有隱情,我是刑警寧澤平酿,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布蜈彼,位于F島的核電站,受9級特大地震影響柳刮,放射性物質(zhì)發(fā)生泄漏秉颗。R本人自食惡果不足惜送矩,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菇怀。 院中可真熱鬧晌块,春花似錦、人聲如沸匆背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铃辖。三九已至猪叙,卻和暖如春仁卷,著一層夾襖步出監(jiān)牢的瞬間犬第,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工充包, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遥椿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓家浇,卻偏偏與公主長得像碴裙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舔株,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容