轉(zhuǎn)自公眾號投稿:https://mp.weixin.qq.com/s/zi5uUC3lOYqKUktboEp0OA
一、 寫在前面
本文討論的基礎(chǔ),是基于Robotframework(簡稱RF)+Selenium測試框架的web前端自動化測試。針對Robotframework和Selenium的安裝、使用等基礎(chǔ)知識不做介紹,只討論在進(jìn)行自動化腳本編寫過程中遇到的元素定位失敗問題。
二、 但是你不得不了解的事
RF框架在做前端自動化時(shí),支持的元素定位方式有:css定位、id定位、name定位、xpath定位和js定位。在介紹如何使用這幾種方法之前,你不得不認(rèn)識并熟悉我們web測試的基礎(chǔ)工具(客戶端)——瀏覽器。以chrome瀏覽器為例,chrome的開發(fā)者工具欄的element面板,提供了用戶捕捉前端元素及獲取元素定位的方法。如下圖1所示,打開chrome開發(fā)工具的Elements面板,點(diǎn)擊最左側(cè)的箭頭(圖中1),在界面點(diǎn)擊關(guān)鍵字搜索框(圖中2),即可獲取搜索框的元素(圖中3)html文本“<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">”,在該html文本處右鍵點(diǎn)擊,并點(diǎn)擊Copy按鈕(圖中4),即可見chrome關(guān)于該搜索框元素定位的幾種方式:selector、Xpath、JS path。
如圖1例中,selector的值為“#kw”;Xpath的值為“//*[@id="kw"]“;JS path的值為“document.querySelector("#kw")”。selector提供了css或id或name的元素定位方式,Xpath提供了xpath相對路徑的元素定位方式。使用selector和Xpath,結(jié)合RF Selenium2Library的Click Element、Click Button、Checkbox Should Be Selected等關(guān)鍵字使用,即可定位元素進(jìn)行點(diǎn)擊、判斷等操作。除此外,RF還提供js定位方式,結(jié)合chrome的JS Path和RF的Execute JavaScript關(guān)鍵字,即可完成對元素的操作。

三、 你可能不知道的事
盡管使用過“二”中的幾種定位方式,能夠捕捉到大部分元素,但是現(xiàn)實(shí)往往不是那么盡善盡美,你可能還是遇到了下面幾個(gè)問題:
1、 自動化腳本編寫好,測試通過了,但是過幾天回歸測試就失敗,元素找不到?
在這里,只能建議你:請確認(rèn)你所使用的定位方式是唯一不變的。例如,避免使用“//*[@id="9134245532398"]“這類包含動態(tài)id的xpath定位方式。有的前端設(shè)計(jì)某些元素的id為隨機(jī)數(shù),每次刷新都會更改,切記勿用這類隨機(jī)變換的標(biāo)識做元素識別。元素定位只有一個(gè)標(biāo)準(zhǔn):唯一性,推薦id和name優(yōu)先。
2、 元素處于frame框架嵌套中,即使獲取到了正確的定位路徑,測試腳本運(yùn)行仍然失???
請記住,處于frame框架中的元素,你需要先切換進(jìn)frame(RF的 select frame關(guān)鍵字試一試,會有驚喜),再進(jìn)行元素定位。好比你遠(yuǎn)遠(yuǎn)地看到一扇玻璃窗里有個(gè)熟人,你大聲跟他說話,他卻無動于衷。這個(gè)時(shí)候,你需要走進(jìn)這扇玻璃窗的門里,因?yàn)椋AТ笆歉粢舻?,你的呼喊門里的人聽不見。
3、 如何操作被遮擋的元素?
針對這類情況,也許你嘗試了id、name、css和xpath等定位方法,結(jié)果都失敗了。也不存在2中所說的frame切換,不要灰心,試試js定位操作吧。使用RF的execute javascript配合JS path直接操作被遮擋元素,百試不爽。
4、 如何處理新開tab頁或新開窗口后的元素操作?
同2方法類似,將當(dāng)前操作的窗口切換到新開的窗口或tab頁,再結(jié)合chrom的元素定位路徑對元素進(jìn)行操作,RF的select window值得嘗試。
5、 定位沒問題,點(diǎn)擊按鈕有顯示被點(diǎn)中的樣式,但是就是沒效果?
元素定位正確,使用click button和click element點(diǎn)擊元素都,也無報(bào)錯(cuò),就是沒反應(yīng),那就試試press key按鈕吧。
6、 自動化測試腳本運(yùn)行太快,頁面還沒加載出來,元素找不到?
這個(gè)時(shí)候,沒有其他辦法,只能設(shè)置等待時(shí)間或者使用RF的Element Should Be Visible這類關(guān)鍵字判斷元素已經(jīng)再頁面可見或可用后,在進(jìn)行操作。
四、 告訴你一個(gè)大事情
如果你遇到的問題,“三“中的方法都不能解決,那么……打印源碼吧。RF的get source關(guān)鍵字,將會告訴你,你當(dāng)前操作的頁面,所有html文本,按圖索驥,根據(jù)你的定位方式是否真的能在當(dāng)前頁面中找到你定位的元素。get source將是你調(diào)試路上的好幫手!