Airtest+python+selenium 一套輕量級web自動化測試框架

Aritest 簡介

Airtest是一套跨平臺的測試框架,它提供了跨平臺的API,包括安裝應(yīng)用偎箫、模擬輸入、斷言等皆串。 基于圖像識別技術(shù)定位UI元素淹办,你無需嵌入任何代碼即可進(jìn)行自動化測試。測試腳本運(yùn)行后可以自動生成詳細(xì)的HTML測試報(bào)告恶复,讓你迅速定位失敗的測試點(diǎn)怜森,適用于游戲、App和web谤牡,支持平臺有Windows副硅、Android、iOS和瀏覽器翅萤。

Airtest 集成的多個(gè)測試框架恐疲,基于web自動化測試的selenuim框架,基于Chrome Devtools Protocol協(xié)議套么,自動錄制生成selenium腳本培己,精確定位與操作界面元素,支持多瀏覽器(Chrome违诗、Safari漱凝、Firfox等主流瀏覽器)疮蹦;Poco基于UI控件識別的自動化框架诸迟,目前支持Unity3D/cocos2dx-/Android原生app/iOS原生app/微信小程序,也可以在其他引擎中自行接入poco-sdk來使用愕乎。

AirtestIDE 是一個(gè)強(qiáng)大的GUI工具阵苇,是網(wǎng)易配套推出的跨平臺UI自動化測試編輯器,它內(nèi)置了Airtest和Poco的相關(guān)插件功能感论,可以幫助你快速簡單地完成錄制绅项、編寫腳本。


?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Airtest-selenium測試框架原理圖

語言基礎(chǔ)(python)

使用Airtest這一套框架比肄,對開發(fā)編程語言的能力要求不不高快耿,只要了解python的基本語法鹅颊,具備基礎(chǔ)的python編寫腳本的能力即可间雀。

python 特點(diǎn)/特性:

【1】 - 易于學(xué)習(xí),入門所需時(shí)間極短

【2】- 少量代碼即可實(shí)現(xiàn)功能鸦列,python代碼非常精簡妥色,只需要少量代碼即可構(gòu)造更多功能

【3】 - 可擴(kuò)展性非常好搪花,python上有各種各樣的模塊、工具庫,導(dǎo)入即可使用

【4】 - 支持多平臺Windows/Linux/macOS撮竿,python作為目前美國高校最受歡迎的編程語言之一吮便,可在多個(gè)領(lǐng)域平臺中廣泛使用

【5】- 可與多種編程語言集成(C/Java/C#/ObjectC/Ruby等),且實(shí)現(xiàn)穩(wěn)定性一流幢踏。


web測試基礎(chǔ)知識

要實(shí)現(xiàn)web的自動化測試髓需,需要對web的基礎(chǔ)知識和基礎(chǔ)概念有基本的了解。

【1】HTML文檔的基本構(gòu)成房蝉,HEAD頭部包含網(wǎng)頁標(biāo)題授账,BODY展示網(wǎng)站主體內(nèi)容,各種類型標(biāo)簽/屬性

【2】CSS基本的規(guī)則結(jié)構(gòu)惨驶,選擇器(selector)和聲明塊(declaration blocks)白热,每個(gè)聲明則是一個(gè)屬性-值(property-value)

【3】CSS通配選擇器(*universal selector)類選擇器(.class selector)ID選擇器(#ID selector)類選擇器結(jié)合元素選擇器(element.class selector)多類選擇器(.class.class selector)屬性選擇器(attribute selector)

【4】理解DOM和element之間的關(guān)聯(lián),DOM并不是JavaScript語言的一部分粗卜,它是瀏覽器的一部分屋确,可以通過JavaScript語言的document對象全局訪問,也就是說续扔, html 文件通過瀏覽器解析攻臀,解析之后就形成了一顆 DOM 樹,可以通過JavaScript 來動態(tài)修改 html 的內(nèi)容纱昧,也就是修改網(wǎng)頁的內(nèi)容和排版刨啸。

【5】Selenium提供的常用定位方式,ID识脆,Name设联,Class,CSS selector和xpath灼捂。


完整的測試流程

一個(gè)完整的測試流程應(yīng)該包含哪些离例?

【1】首先,要有清晰的測試需求悉稠,明確要進(jìn)行測試的對象宫蛆、范圍以及測試目的;測試是一個(gè)持續(xù)性可重復(fù)操作的一個(gè)驗(yàn)證過程的猛,在不同的階段耀盗,對于不同的項(xiàng)目系統(tǒng)/產(chǎn)品,存在不同的測試目的及測試手段卦尊,測試對象及范圍都不一樣的叛拷。清楚當(dāng)前將要進(jìn)行的測試是為了達(dá)到什么目的,收到什么樣的成果以及需要達(dá)到一個(gè)什么程度猫牡,定下項(xiàng)目的測試范圍胡诗。

【2】明確了測試對象邓线,測試需求也理清楚了,就可以開始制定測試方案煌恢。 選用什么框架骇陈、需要什么輔助的技術(shù)工具、支持什么平臺瑰抵、需要什么樣的測試環(huán)境你雌,當(dāng)這一切方案都定下來,就可以開始著手編寫測試用例二汛。

【3】規(guī)范的測試用例婿崭,包含步驟(STEPS)的詳細(xì)描述,對應(yīng)測試的預(yù)期結(jié)果(EXPECT RESULT)肴颊,運(yùn)行該測試的預(yù)設(shè)條件(PRECONDTION)氓栈,該測試用例的要用到測試數(shù)據(jù)(TEST-DATA),很多公司特別是大公司對用例的模板規(guī)范都有著嚴(yán)格的要求婿着。 對于自動化測試來說授瘦,同樣重要。

【4】編寫腳本竟宋,在代碼腳本中適當(dāng)?shù)刈⑨寣τ谝院缶S護(hù)起著相當(dāng)重要的作用提完,特別是如果代碼行比較多的情況下。通常會優(yōu)先選擇基礎(chǔ)功能驗(yàn)證的自動化丘侠,可替代手工式黑盒的日惩叫溃回歸測試。因?yàn)椴⒎撬械臏y試用例都適合做自動化測試蜗字,因而一般會選擇比較核心的單一功能來實(shí)現(xiàn)打肝;而測試腳本的每個(gè)用例也是盡量精簡,多個(gè)精簡的用例串起來執(zhí)行就可以是一個(gè)完整的測試流程秽澳,盡量避免一個(gè)腳本跑太復(fù)雜的用例測試闯睹,當(dāng)一個(gè)測試腳本包含太多步驟的時(shí)候,不僅僅會耗費(fèi)的時(shí)間同樣會增加調(diào)式的難度担神,以及日后腳本維護(hù)的復(fù)雜度。

【5】測試腳本完成始花,通過調(diào)試妄讯,測試環(huán)境也搭建好了,就可以執(zhí)行測試腳本酷宵,查看測試報(bào)告亥贸,記錄反饋BUG,定時(shí)執(zhí)行測試浇垦。


安裝與環(huán)境搭建

Airtest是基于python語言開發(fā)的測試框架炕置,需要先把python環(huán)境搭建好,再安裝Airtest/AirtestIDE。安裝時(shí)需要注意的是版本的依賴關(guān)系朴摊,最新版python沒有airtest依賴的庫默垄,而且最新版本python沒有二進(jìn)制的只有源碼,所以搭建時(shí)建議使用的是舊一點(diǎn)2.7版本的python :

? Latest Python 2 Release - Python 2.7.15

搭建python環(huán)境

到python官網(wǎng)下載對應(yīng)系統(tǒng)的壓縮包:

https://www.python.org/

1)Window 平臺安裝Python

下載對應(yīng)的壓縮包版本 :https://www.python.org/downloads/release/python-2715/

64位系統(tǒng)的下載Windows x86-64 MSI installer甚纲,32位系統(tǒng)的下載Windows x86 MSIinstaller

python的安裝非常簡單口锭,下載后打開安裝包,按照python的安裝向?qū)б恢眓ext即可完成介杆,安裝時(shí)記得要把Add to

path 打勾就不需要自己修改環(huán)境變量了 鹃操。

2)MAC 平臺安裝Python

系統(tǒng)是OS X 10.8或者最新的10.9 Mavericks的MAC是自帶python2.7的,如果OS版本沒有包含春哨,自行去下載即可.

用 dmg / pkg 安裝包進(jìn)行安裝荆隘,如果有安裝 brew 的話就可以通過命令行進(jìn)行安裝。

3)Unix & Linux 平臺安裝Python

下載適用于Unix/Linux 的源碼壓縮包(source tarball)

解壓壓縮包

執(zhí)行 ./configure 腳本

make

make install

安裝完成后赴背,Python 會在 /usr/local/bin 目錄下臭胜,Python 的庫一般安裝在/usr/local/lib/pythonXX

設(shè)置環(huán)境變量,export

PATH="$PATH:/usr/local/bin/python"

下載并安裝Airtest/AirtestIDE

執(zhí)行以下命令進(jìn)行安裝:

pip install airtest

需要注意癞尚,當(dāng)時(shí)安裝Airtest的時(shí)候遭遇失敗耸三,原因是最新版本的python沒有airtest依賴的庫,在最新版本python沒有二進(jìn)制的只有源碼浇揩,所以干脆就重新安裝一個(gè)舊的2.7版本的python了仪壮。

安裝成功!

官網(wǎng)上下載對應(yīng)系統(tǒng)的最新版IDE:http://airtest.netease.com/changelog.html

下載后解壓即可用

IDE使用指南

1 - 啟動IDE

2 - 錄制腳本

3 - 編寫腳本

4 - 運(yùn)行腳本

5 - 查看測試報(bào)告

啟動

進(jìn)入已解壓的AirtestIDE目錄胳徽,打開AirtestIDE的應(yīng)用程序积锅,IDE會運(yùn)行一個(gè)后臺服務(wù)以及一個(gè)IDE應(yīng)用界面窗口

IDE啟動后默認(rèn)的界面布局如下圖:

錄制web測試腳本

AirtestIDE 默認(rèn)沒有不會打開web錄制的窗口,需要手動去打開:

打開web錄制窗口后养盗,第一次運(yùn)行需要修改一下IDE對瀏覽器的設(shè)置缚陷,打開選項(xiàng) - 設(shè)置(setting),配置selenium打開瀏覽器應(yīng)用程序的路徑

快速操作按鍵打開一個(gè)新腳本文件往核,通過selenium window打開一個(gè)新的錄制窗口:

Do you want to insert poco init code at the current curosr position [Yes] [No] 是否導(dǎo)入初始化代碼到光標(biāo)所在位置箫爷,選擇【Yes】之后會導(dǎo)入selenium相關(guān)的依賴庫,只在第一次需要導(dǎo)入聂儒。

通過selenium window - start_web 打開一個(gè)新頁面虎锚,輸入需要進(jìn)行測試的URL地址:

在剛打開錄制的瀏覽器窗口,輸入測試URL地址衩婚,點(diǎn)擊selenium window - 錄制按鈕窜护,即可開始錄制測試腳本:

selenium 窗口還提供了一些常用的錄制操作,如下圖所示:

編寫腳本

腳本編輯窗口右上角有一個(gè)小菜單非春,可以快速打開該腳本的報(bào)告目錄柱徙、報(bào)告缓屠、打開最后運(yùn)行的日志報(bào)告和清理運(yùn)行截圖

Web 錄制無法模擬的按鍵操作,可以手動通過代碼來完成护侮,比如send keys敌完, keys.ENTER 等等。

常見的操作元素方法如下:

- clear 清除元素的內(nèi)容

-?send_keys 模擬按鍵輸入

-?click 點(diǎn)擊元素

-?submit 提交表單send_keys(Keys.RETURN)相當(dāng)于回車登錄, 如果需要輸入中文概行,防止編碼錯(cuò)誤使用send_keys(u"中文用戶名")

通過WebElement接口可以獲取常用的值:

-?size 獲取元素的尺寸

-?text 獲取元素的文本

-?get_attribute(name) 獲取屬性值

-?location 獲取元素坐標(biāo)蠢挡,先找到要獲取的元素,再調(diào)用該方法

-?page_source 返回頁面源碼

-?driver.title 返回頁面標(biāo)題

-?current_url 獲取當(dāng)前頁面的URL

-?is_displayed() 設(shè)置該元素是否可見

-?is_enabled() 判斷元素是否被使用

-?is_selected() 判斷元素是否被選中

-?tag_name 返回元素的tagName

常見鍵盤操作

-?send_keys(Keys.ENTER) 按下回車鍵

-?send_keys(Keys.TAB) 按下Tab制表鍵

-?send_keys(Keys.SPACE) 按下空格鍵space

-?send_keys(Kyes.ESCAPE) 按下回退鍵Esc

-?send_keys(Keys.BACK_SPACE) 按下刪除鍵BackSpace

-?send_keys(Keys.SHIFT) 按下shift鍵

-?send_keys(Keys.CONTROL) 按下Ctrl鍵

-?send_keys(Keys.ARROW_DOWN) 按下鼠標(biāo)光標(biāo)向下按鍵

-?send_keys(Keys.CONTROL,'a') 組合鍵全選Ctrl+A

-?send_keys(Keys.CONTROL,'c') 組合鍵復(fù)制Ctrl+C

-?send_keys(Keys.CONTROL,'x') 組合鍵剪切Ctrl+X

-?send_keys(Keys.CONTROL,'v') 組合鍵粘貼Ctrl+V

運(yùn)行腳本

執(zhí)行菜單欄下的快捷操作按鈕運(yùn)行腳本:

腳本運(yùn)行時(shí)凳忙,log查看窗口會實(shí)時(shí)打印代碼運(yùn)行日志:

包含腳本啟動信息业踏,語句執(zhí)行情況,截圖位置涧卵,運(yùn)行結(jié)果及耗費(fèi)時(shí)間勤家。

查看測試報(bào)告

執(zhí)行菜單欄下的快捷操作按鈕查看測試報(bào)告:

測試報(bào)告包含測試用例目錄名稱,作者柳恐,運(yùn)行時(shí)間伐脖,測試點(diǎn)匯總,每個(gè)步驟的執(zhí)行時(shí)間乐设、測試內(nèi)容讼庇、截圖及運(yùn)行結(jié)果

AirtestIDE官方說明文檔

https://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/index.html


查找定位元素

AirtestIDE 對web錄制支持已經(jīng)挺完善的了,大部分的控件操作都可以通過錄制來完成近尚,最簡單的使用方法就是錄制腳本蠕啄,但其實(shí)不僅僅是錄制,有時(shí)候通過查找定位元素來編輯腳本會更加加強(qiáng)測試腳本的使用性戈锻,畢竟IDE是通過界面錄制進(jìn)行的歼跟,有的界面元素通過錄制可能會取不到,又或者包含動態(tài)的一些無法直接完成操作測試的實(shí)際情況格遭,所以更簡單有效的辦法就是錄制+編寫哈街。

find element

selenium.webdriver 模塊提供了所有WebDriver的實(shí)現(xiàn), 當(dāng)前支持的WebDriver有: Firefox, Chrome, IE and Remote拒迅。 `Keys`類提供鍵盤按鍵的支持骚秦,大量的方法讓你去查詢頁面中的元素:

較常用查找定位元素使用的方法通過id、name坪它、xpath骤竹、selector、classname往毡,接下來會逐一介紹這幾種find element的使用方法。

find element by id:

確定元素的id名稱靶溜,直接通過id查找可定位到元素开瞭,將返回頁面查找到的第一個(gè)id元素

find_element_by_id("loginsubmit")

find element by name:

與id同樣懒震,當(dāng)確定元素的name名稱時(shí),可直接通過name查找定位元素嗤详,同樣地个扰,selenium將會返回頁面查找到的第一個(gè)name元素

find_element_by_name('username')

find_element_by_name("password")

find element by xpath:

xpath在xml文檔中可遍歷節(jié)點(diǎn)元素和屬性,是XML路徑語言葱色。xpath同時(shí)擴(kuò)展了通過id/name查找元素的方式递宅,即是說,如果當(dāng)前元素是id值苍狰,xpath會自動識別成("http://*[@id="top-menu"])办龄,同時(shí)諸多類型如input、button淋昭、錨點(diǎn)a俐填、iamge等都可以進(jìn)行判斷,比如 ("http://button[@data-role='submit']") 翔忽,xpath的形式復(fù)雜多變英融,對于網(wǎng)站頁面千變?nèi)f化的內(nèi)容而言,xpath能夠很好的自適應(yīng)歇式。

使用相對路徑的寫法以雙斜線開頭驶悟,絕對路徑以單斜線開頭從html最頂層開始遍歷,如下圖:

find_element_by_xpath("/html/body/form[1]")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #絕對路徑

find_element_by_xpath("http://form[1]")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#頁面中的第一個(gè)form元素

find_element_by_xpath("http://form[@id='loginForm']")? ? ? ? ? ? ? ? ? ? ? ? ? #包含id屬性并且其值為loginForm

一般格式為//tagname[@attribute='value']/路徑/路徑材失,如//[@id="J_PmTaskInput"]/div/label ,? [*]表示包含所有

但不推薦使用絕對路徑痕鳍,因?yàn)轫撁婵赡芙?jīng)常元素變化,稍有改動可能就會導(dǎo)致定位失敳蜚尽额获;相對路徑定位相對而言位置關(guān)系改動的概率更低,更靠譜恭应,這樣腳本健壯性適應(yīng)性更強(qiáng)抄邀。

有一些非常有用的插件,可以協(xié)助發(fā)現(xiàn)元素的XPath:

- XPath Checker - suggests XPath and can be used to test XPath results.

- Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.

- XPath Helper - for Google Chrome

通過就近的包含id或者name屬性的元素出發(fā)定位你的元素昼榛,這樣相對關(guān)系就很靠譜境肾, 因?yàn)檫@種位置關(guān)系很少改變,所以可以使你的測試更加強(qiáng)大胆屿。

find elment by css selector:

通過css選擇器定位元素奥喻,將返回頁面第一個(gè)匹配到的元素。

find_element_by_css_selector("#J_Milestone > div.os-milestone-check > div")

find_element_by_css_selector("button.ui.teal.J_Pay")? ? ? ? ? ?#查找tagtype.class.class..

find_element_by_css_selector("div.ui.negative.button")? ? ? ? #查找所有div標(biāo)簽里面class包含ui非迹、negative环鲤、button的元素

常用的選擇器:

#表示id,查找id名稱為J_Milestone的屬性憎兽,以及該屬性的下一級div

.表示class冷离,查找該id下一級的div的class為os-milestone-check

*表示所有元素吵冒,>表示下一級

[]表示attribute,屬性名稱西剥,[attribute=value] 指某屬性值的該屬性

:nth-child(n) 表示該父元素的第幾個(gè)子元素

css selector 相較于xpath的優(yōu)點(diǎn)就是性能比xpath好痹栖,另外就是頁面排版布局位置有時(shí)候會變,但css selector相對更穩(wěn)定瞭空,名稱一般不會經(jīng)常變更揪阿。

find element by class name:

確定元素的class name,可通過class name直接查找定位元素咆畏,將會返回該頁面第一個(gè)匹配的class屬性的元素南捂。

find_element_by_class_name('content')

當(dāng)頁面存在多個(gè)相同class屬性值的元素時(shí),通過class name查找也只能返回第一個(gè)結(jié)果鳖眼。

find element by link text:

這是一個(gè)查找超鏈接非常方便的一個(gè)定位方法黑毅,當(dāng)確切知道頁面的某個(gè)超鏈接使用的標(biāo)簽文本名稱,那可以直接通過find_element_by_link_text 查找钦讳,將會返回頁面第一個(gè)匹配的錨點(diǎn)標(biāo)簽矿瘦。

find_element_by_partial_link_text('快速入門')

find element by partial link text:

這也是一個(gè)查找超鏈接的方法,跟find_element_by_link_text的區(qū)別在于愿卒,前者是精確查找缚去,后者是模糊查找,也是相當(dāng)好用的定位方法;同樣地琼开,也是會返回頁面第一個(gè)匹配的錨點(diǎn)標(biāo)簽易结。

find_element_by_partial_link_text('入門')

以上查找元素find elmenet的方法,不管是哪一種柜候,都是只會返回頁面第一個(gè)匹配的元素的搞动;如果沒有查找到任何匹配的元素,將會返回一個(gè)異常:

NoSuchElementException

返回多個(gè)元素

在實(shí)際運(yùn)用中渣刷,還會存在一種情況鹦肿,就是查找元素的時(shí)候,當(dāng)前頁面返回的元素匹配的結(jié)果不止一個(gè)辅柴,find elment只能返回第一個(gè)結(jié)果箩溃,而有些情況下某些被需要的測試元素恰恰并不是第一個(gè)返回要的結(jié)果。

舉一個(gè)實(shí)際項(xiàng)目中的遇到的例子碌嘀,某網(wǎng)站的某個(gè)頁面上一個(gè)時(shí)間控件涣旨,測試需求需要對時(shí)間控件進(jìn)行選擇操作,頁面內(nèi)容如圖:

直接使用find element來定位元素股冗,會返回一個(gè)錯(cuò)誤的結(jié)果:

find_element_by_xpath("http://button[@class_name='xdsoft_next']").click()

selenium.common.exceptions.ElementNotVisibleException:Message:elementnotvisible

原因是該頁面上有2個(gè)時(shí)間控件霹陡,所以返回的操作按鍵結(jié)果也不止一個(gè),而find_element返回的第一個(gè)結(jié)果恰巧在該頁面該操作下是不被需要的,是被隱藏的元素穆律,所以對其進(jìn)行操作時(shí)會報(bào)錯(cuò) element is not visible 惠呼,一個(gè)解決辦法就是通過find elemets來查找多個(gè)元素导俘。

find elements 查找元素的方法跟find element 是類似的峦耘,不同的是find elements會返回一個(gè)list列表。

- find_elements_by_name

- find_elements_by_xpath

- find_elements_by_link_text

- find_elements_by_partial_link_text

- find_elements_by_tag_name

- find_elements_by_class_name

- find_elements_by_css_selector

上面的示例中旅薄,通過下面的代碼可以定位到下個(gè)月按鈕的元素辅髓,并對其進(jìn)行操作:

find_element_by_xpath("http://div[@class='xdsoft_mounthpicker']/button[2]")? ? ?#通過xpath定位到指定的button

find_elements_by_class_name('xdsoft_next')[2]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#通過classname定位到指定的button

在xpath過濾后還可以進(jìn)入下一級過濾的,可以用 /button[n] 取下一級的某個(gè)索引少梁,索引的用法只適用于直接在某種類型的element后面洛口,比如:

find_element_by_xpath("http://div[@class='xdsoft_mounthpicker']/button[1]")

初學(xué)者容易會寫成下面的錯(cuò)誤示范:

find_element_by_xpath("http://button[@class='xdsoft_next'][1]")? ? ? ? ? ? #屬性過濾后無法直接調(diào)用索引

通過以上方法就可以成功對該元素時(shí)間控件下個(gè)月按鈕進(jìn)行點(diǎn)擊操作了。

斷言

一個(gè)完整的測試腳本一定會包含對測試結(jié)果是否與預(yù)測結(jié)果一致的對比凯沪,從而判斷腳本是否執(zhí)行成功第焰,Airtest提供了以下斷言方法:

assert_exists

assert_not_exists

assert_equal

assert_not_equal

assert exists? 使用方法:

assert_exist("http://*[@id=\"main\"]/div/div[2]/h3", "xpath", "請?zhí)顚憸y試點(diǎn).")? ? #判斷該元素在頁面是否存在

如果元素不存在,則會拋出一個(gè)異常妨马,AssertionError("%s does not exist in screen, message: %s" % (v, msg))挺举, 在log查看窗口可看到實(shí)時(shí)的調(diào)試日志。

assert_not_exists 使用方法:

assert_not_exist("http://*[@id=\"main\"]/div/div[2]/h3", "xpath", "請?zhí)顚憸y試點(diǎn).")? ? #判斷該元素在頁面是否不存在

如果返回結(jié)果不匹配烘跺,則會拋出異常湘纵,AssertionError("%s exists unexpectedly at pos: %s, message: %s" % (v, pos, msg)) ,在log查看窗口可看到實(shí)時(shí)的調(diào)試日志滤淳。

assert_equal 使用方法:

assert_equal(driver.find_element_by_id("top-menu").text, "確認(rèn)完成", "發(fā)布確認(rèn)完成")#判斷id屬性為top-menu的元素文本信息是否等于“確認(rèn)完成”

如果元素結(jié)果不匹配梧喷,則會拋出異常,AssertionError("%s and %s are not equal, message: %s" % (first, second, msg))脖咐,在log查看窗口可看到實(shí)時(shí)的調(diào)試日志铺敌。,在log查看窗口可看到實(shí)時(shí)的調(diào)試日志屁擅。

assert_not_equal 使用方法:

assert_not_equal(driver.find_element_by_id("J_FinishProject").text, "完成", "流程狀態(tài)為已完成")#判斷id屬性為"J_FinishProject的元素文本信息是否等于“完成”

與assert equal類似偿凭,如果返回結(jié)果不匹配的就會拋出異常。

Airtest 提供的斷言種類并不算豐富煤蹭,只能簡單地對某個(gè)測試結(jié)果或狀態(tài)進(jìn)行判斷笔喉,實(shí)際項(xiàng)目種更為常用的應(yīng)該是assert equal了,而且如果使用自己構(gòu)建的函數(shù)對測試結(jié)果進(jìn)行判斷硝皂,那么該代碼執(zhí)行的測試結(jié)果并不會記錄在html的測試報(bào)告里面常挚。為了讓assert斷言可以完成更多的事情,可以使用傳入函數(shù)的方法來進(jìn)行判斷稽物,比如下面的例子:

def check_finish():? ? pro_status = driver.find_element_by_css_selector("div.panel.newbie-container.J_ProjectCommit > div.ui.form.fluid > div > div > div:nth-child(1) > div.content > div.extra.text").text

? ? status = "指派成功"? ? if status in pro_status:? ? ? ? print("project finishs!")? ? ? ? return True? ? else :? ? ? ? print("project not finish, please check!")? ? ? ? return Falseassert_equal(check_finish(), True, "Project all finish! AutoTest is done!")?def pro_assign(dev_id):? ? driver.find_element_by_xpath("http://input[@placeholder='用戶UID']").send_keys(dev_id)

? ? driver.find_element_by_id("prostatus_appoint_submit").click()? ? driver.switch_to.alert.accept()? ? def check_devstatus():? ? ? ? pro_devstatus = driver.find_element_by_css_selector("div.panel.newbie-container.J_ProjectCommit > div.ui.form.fluid > div > div > div:nth-child(1) > div.content > div.extra.text").text

? ? ? ? pro_devassign = "對接了第1位開發(fā)者奄毡,等待開發(fā)者確認(rèn)"? ? ? ? if pro_devassign in pro_devstatus:

? ? ? ? ? ? return True? ? ? ? else :? ? ? ? ? ? return False? ? ? ? ? ? print("后臺指派第一位開發(fā)者異常,請手動查看項(xiàng)目狀態(tài)")? ? ? ? ? ? driver.quit()? ? assert_equal(check_devstatus(), True, "指派成功贝或!")

這樣依然可以在html測試報(bào)告顯示函數(shù)執(zhí)行后的結(jié)果吼过,而且使用更靈活:

結(jié)束語

總體來說锐秦,作為一個(gè)年齡還算比較新的測試框架,這個(gè)測試工具還有許多不足的地方盗忱,需要完善的地方酱床,比如啟動瀏覽器時(shí)間比較久,需要等待瀏覽器渲染頁面腳本加載完成才有辦法執(zhí)行步驟趟佃,不能從腳本中途進(jìn)行斷點(diǎn)調(diào)試扇谣,有時(shí)候打開多個(gè)窗口的時(shí)候錄制窗口會失焦等,但個(gè)人認(rèn)為這仍是一個(gè)非常好用的界面自動化測試的入門工具闲昭。而且自今為止罐寨,AirtestIDE還有在持續(xù)地更新版本,在App的自動化測試上使用的更廣泛序矩,希望可以越來越完善鸯绿,應(yīng)用更廣泛。

簡書的編輯器真的是弱到簸淀,文章寫好發(fā)布都好費(fèi)勁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓶蝴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啃擦,更是在濱河造成了極大的恐慌囊蓝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件令蛉,死亡現(xiàn)場離奇詭異聚霜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)珠叔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝎宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祷安,你說我怎么就攤上這事姥芥。” “怎么了汇鞭?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵凉唐,是天一觀的道長。 經(jīng)常有香客問我霍骄,道長台囱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任读整,我火速辦了婚禮簿训,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己强品,他們只是感情好膘侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著的榛,像睡著了一般琼了。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上困曙,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天表伦,我揣著相機(jī)與錄音,去河邊找鬼慷丽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鳄哭,可吹牛的內(nèi)容都是我干的要糊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妆丘,長吁一口氣:“原來是場噩夢啊……” “哼锄俄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勺拣,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奶赠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后药有,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅戈,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年愤惰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苇经。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宦言,死狀恐怖扇单,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奠旺,我是刑警寧澤蜘澜,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站响疚,受9級特大地震影響鄙信,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稽寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一扮碧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦慎王、人聲如沸蚓土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀漆。三九已至,卻和暖如春咱旱,著一層夾襖步出監(jiān)牢的瞬間确丢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工吐限, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲜侥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓诸典,卻偏偏與公主長得像描函,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子狐粱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355