p2p網(wǎng)站建設(shè) 上海網(wǎng)店代運(yùn)營(yíng)騙局
1. 前言
本文將詳細(xì)講解Poco控件定位的各種方式,利用這些方法可以幫助我們編寫(xiě)出目標(biāo)控件的定位腳本。我們?cè)贗DE錄制的poco腳本,常見(jiàn)的都是類似 poco(“star_single”).click()這樣的腳本,其中 poco(“star_single”) 這塊就屬于Poco控件定位腳本啦。
2. 三種定位選擇器
Poco控件最基本的3種定位選擇器分別是:
基本選擇器
相對(duì)選擇器
空間順序選擇器
1)基本選擇器
在poco實(shí)例后加一對(duì)括號(hào),我們就可以進(jìn)行元素選擇了。選擇器會(huì)遍歷所有元素,將滿足給定條件的元素都選出來(lái)并返回。
括號(hào)里的參數(shù)就是所給定的條件,用屬性名值對(duì)表示,其中第一個(gè)參數(shù)表示 節(jié)點(diǎn)名 ,就像 poco("star_single")
。后面還可以跟著一些可選參數(shù),均表示 節(jié)點(diǎn)的屬性及預(yù)期的屬性值 :
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()poco("star_single",type="Image")
通過(guò)屬性組合
如果元素屬性不能唯一定位,可通過(guò)組合屬性方式
poco(name = 'NodeName',type = '類型名比如Button')
2)相對(duì)選擇器
如果直接用節(jié)點(diǎn)屬性(或者說(shuō)僅僅使用基本選擇器)沒(méi)法選出你所想要的元素時(shí),你還可以通過(guò)元素之間的渲染層級(jí)關(guān)系進(jìn)行選擇,例如父子關(guān)系(child)、兄弟關(guān)系(sibling)、祖先后代關(guān)系(offspring)等等:
如:
poco("plays").child("playBasic").offspring("star_single")
poco('父節(jié)點(diǎn)').child('子節(jié)點(diǎn)') # 默認(rèn)取第一個(gè),也可以通過(guò)下標(biāo),我使用過(guò)-1,-2,1 ,2 等下標(biāo)
孫節(jié)點(diǎn)offspring
,當(dāng)根據(jù)child().child()定位時(shí),如果第二個(gè)child是前面一個(gè)的孫節(jié)點(diǎn),不能定位到,要用offspring,child節(jié)點(diǎn)必須是上個(gè)節(jié)點(diǎn)的兒子節(jié)點(diǎn),不能跨輩分
poco('父節(jié)點(diǎn)').child('子節(jié)點(diǎn)').offspring('孫節(jié)點(diǎn)')
兄弟節(jié)點(diǎn)sibling
兄弟可能是多個(gè),可通過(guò)下標(biāo)方式
poco('name').sibling()
父節(jié)點(diǎn)parent
獲取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
poco('name').parent()
poco(text="春天的菠菜").parent().parent()
直到某個(gè)元素出現(xiàn)
poco('屬性').wait_for_appearance(timeout=3) # wait until appearance within 3s
直到某個(gè)元素消失
元素.wait_for_disappearance()
獲取元素屬性
#獲取當(dāng)前元素 pos屬性的值
#a = poco(name="com.yunmall.lc:id/textView5").parent().attr('pos')
?
#獲取當(dāng)前元素的名字 get_name()
#a = poco(name="com.yunmall.lc:id/textView5").parent().get_name()
?
#獲取當(dāng)前元素的文本信息 其實(shí)獲取的是text屬性的值
# poco(name="com.yunmall.lc:id/textView5").parent().get_text()
設(shè)置元素屬性
#選取元素 輸入內(nèi)容為123 其實(shí)也是設(shè)置text屬性的值
poco("pos_input").set_text("123")
?
#設(shè)置text屬性的值為456
poco("pos_input").setattr('text',"456")
.判斷控件是否存在,并進(jìn)行操作
print(obj.exists())
#判斷密碼框元素是否可見(jiàn),可見(jiàn)則輸入內(nèi)容在輸入內(nèi)容
password_input = poco(name='com.yunmall.lc:id/logon_password_textview')if password_input.exists():poco(name='com.yunmall.lc:id/logon_password_textview').set_text("123456")
點(diǎn)擊和長(zhǎng)按
#點(diǎn)擊 按鈕
poco('NodeName').click()
#長(zhǎng)按 按鈕
poco('NodeName').long_click()
#長(zhǎng)按按鈕 指定時(shí)間 單位為s
poco('NodeName').long_click(duration=5)
3)空間順序選擇器
按照序號(hào)(順序)進(jìn)行選擇總是按照空間排布順序,先從左往右,再像之前那樣一行一行從上到下。如下圖所示,我們利用選擇器選中了很多個(gè) type=“Text” 的元素,然后再利用索引順序逐個(gè)選中單個(gè)元素:
name0 = poco("Content").child(type="Text")[0].get_name()
name1 = poco("Content").child(type="Text")[1].get_name()
name2 = poco("Content").child(type="Text")[2].get_name()print(name0+" "+name1+" "+name2)
索引選擇有個(gè)特例,一旦進(jìn)行選擇后,如果元素的位置發(fā)生了變化,那么下標(biāo)序號(hào)仍然是按照選擇的那一瞬間所確定的值。即,如果選擇時(shí)①號(hào)元素現(xiàn)在去到了③號(hào)的位置,那么還是要用 poco(…)[0] 來(lái)訪問(wèn),而不是 poco(…)[2] 。
如果選擇了之后,某個(gè)元素消失了(從界面中移除或者隱藏了),那么如果再訪問(wèn)那個(gè)元素則可能會(huì)發(fā)生異常,其余的元素仍可繼續(xù)訪問(wèn)。
3. 利用正則表達(dá)式匹配控件
其實(shí)除了上述3種常規(guī)一點(diǎn)的定位方式之外,還有一種同學(xué)們比較少見(jiàn),但是非常好用的定位方式,那就是 用正則表達(dá)式來(lái)匹配控件 ,如下述示例這樣:
arb_close_btn = poco(textMatches='^close.*$')
poco(textMatches='^春天的菠菜.') #表達(dá)式根據(jù)自己需要寫(xiě)
poco(textMatches=".*停止.*").click()
如果有些信息的控件名都是一樣的,所以只要我們寫(xiě)1個(gè)正則表達(dá)式,匹配到這一批相同的控件名,就相當(dāng)于定位到了當(dāng)前頁(yè)面所有的歌曲信息控件,就可以利用poco遍歷,逐一獲取控件的text屬性了:
for i in poco(nameMatches="com.*?songInfo"):print(i.get_text())
除了最常見(jiàn)的 textMatches
、 nameMatches
和 typeMatches
,其實(shí)大部分的屬性都可以用這種方式來(lái)傳遞正則表達(dá)式,只要能夠用 poco(xx=預(yù)期屬性值)
來(lái)選擇的控件,就可以用 poco(xxMatches=預(yù)期屬性值的正則表達(dá)式)
來(lái)進(jìn)行匹配定位。
4. 其他較適用的檢測(cè)元素方法
除了上述關(guān)于元素定位 的問(wèn)題,還有比如:有哪些屬性可以拿來(lái)定位元素?利用節(jié)點(diǎn)屬性無(wú)法定位元素時(shí)應(yīng)該怎么處理?為什么明明存在的節(jié)點(diǎn)還會(huì)報(bào)找不到?…
所以我們特意整理了這篇文章,向大家詳細(xì)講述幾種poco元素定位的方式,希望能方便大家在實(shí)際項(xiàng)目中靈活運(yùn)用。
借助IDE的poco輔助窗生成元素定位腳本
AirtestIDE的 poco輔助窗 給我們提供了很多種方式來(lái)生成元素定位的腳本。最簡(jiǎn)單的方法是,點(diǎn)擊poco輔助窗里面的 錄制按鈕
,然后再點(diǎn)擊下目標(biāo)元素:
這樣腳本編輯窗就會(huì)自動(dòng)生成一條點(diǎn)擊控件的腳本,除去腳本中點(diǎn)擊操作的代碼,剩下的 poco("star_single")
,就是定位到黃色星星圖片元素的代碼了。
當(dāng)然,我們還可以使用錄制按鈕旁邊的倆個(gè) 檢視器 按鈕來(lái)幫助我們定位元素。這兩個(gè)檢視器按鈕的區(qū)別在于,是否鎖定當(dāng)前頁(yè)面:
我們可以看到,隨著檢視器定位到某個(gè)元素,輔助窗里面的UI樹(shù)也會(huì)隨著定位到相應(yīng)的元素上,這時(shí)我們可以 雙擊 UI樹(shù)對(duì)應(yīng)的位置,即可在腳本編輯窗自動(dòng)生成定位元素的腳本。
補(bǔ)充:
poco的坐標(biāo)系
左上角(0,0),右下角(1,1),橫坐標(biāo)為x,縱坐標(biāo)為y,點(diǎn)擊節(jié)點(diǎn)的某個(gè)位置
#點(diǎn)擊節(jié)點(diǎn)的中心點(diǎn)位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus('center').click()
#點(diǎn)擊節(jié)點(diǎn)的靠近左上角位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus([0.1, 0.1]).long_click()
#點(diǎn)擊節(jié)點(diǎn)的右下角位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus([1, 1]).long_click()
拖拽和滑動(dòng)
a.拖拽:從一個(gè)節(jié)點(diǎn)位置拖拽到另一個(gè)節(jié)點(diǎn)位置
poco('AeNodeName').drag_to(poco('BeNodeName'))
從列表的一端滑動(dòng)到另一端
listView = poco('Scroll View')
listView.focus([0.5, 0.7]).drag_to(listView.focus([0.5, 0.2]))
b.滑動(dòng):滑動(dòng)列表
poco('Scroll View').swipe([0, -0.1])
poco('Scroll View').swipe('up')
從A點(diǎn)滑動(dòng)到B點(diǎn)
x, y = poco('Scroll View').get_position()
end = [x, y - 0.1]
poco.swipe([x, y], end)
從A點(diǎn)向指定方向和定長(zhǎng)移動(dòng)
x, y = poco('Scroll View').get_position()
dir = [0, -0.1]
poco.swipe([x, y], direction=dir)