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è)異常:
返回多個(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)勁