上期回顧:Poco元素定位和腳本編寫順序
2023.9.3更新:poco1.0.87新增refresh()接口
以下基於
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
注意:Poco框架和Airtest框架很多API是同名的,但使用方法完全不一樣!!!一定不要搞混了,我初學時也經常搞混,這點一定要注意!
具體Poco框架和Airtest框架是什么關系,可以看之前文章:Airtest Project——UI自動化利器介紹
上期講了Poco框架的元素定位,今天我們就接着講元素定位成功后,都有哪些API可以用。想熟練使用Poco框架,以下API必須熟記。
當元素定位后,實際上是實例化了一個UIObjectProxy類,該類源碼在:
your_python_path/site-packages/poco/proxy.py
1.child(name=None, **attrs)
返回第1個符合條件的子元素
參數:
name - name屬性值
**attrs - 其他屬性值
返回:
新的UIObjectProxy實例
示例:
poco("android:id/title").child() # 返回title下的第1個子元素
poco("android:id/title").child("name") # 返回title下的第1個叫"name"的子元素
2.children()
返回所有子元素
參數:
因為是返回所有,所以無需參數
返回:
新的UIObjectProxy實例
3.offspring(name=None, **attrs)
返回符合條件的子孫元素
參數:
name - name屬性值
**attrs - 其他屬性值
返回:
新的UIObjectProxy實例
4.sibling(name=None, **attrs)
返回符合條件的兄弟元素
參數:
name - name屬性值
**attrs - 其他屬性值
返回:
新的UIObjectProxy實例
5.parent()
返回父元素
參數:
父元素只有一個,所以無需參數
返回:
新的UIObjectProxy實例
6.click(focus=None, sleep_interval=None)
單擊元素,如果UI對象是一組元素則點擊第1個
參數:
focus - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即元素左上角,取值范圍0~1
sleep_interval - 休息間隔
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco("btn_start").click() # 點擊元素中心
poco("btn_start").click([0.1,0.1]) # 點擊元素左上角
poco("btn_start").click([0.9,0.9], sleep_interval=3) # 點擊元素右下角,之后休息3秒
7.rclick(focus=None, sleep_interval=None)
右擊,這個應該只在Windows上有,手機沒有。如果UI對象是一組元素則點擊第1個
參數:
focus - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即左上角,取值范圍0~1
sleep_interval - 休息間隔
異常:
PocoNoSuchNodeException:元素不存在
8.double_click(focus=None, sleep_interval=None)
雙擊。不知為啥實際官方在Unity Poco中並未實現double_click,所以直接運行會報錯。可以自己封裝一個,方法為先用get_position()獲取元素在屏幕上的相對坐標點,再乘以屏幕長寬得到絕對坐標點,再調用Airtest框架的touch()方法,其參數有一個times設成2即可。
參數:
focus - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即左上角,取值范圍0~1
sleep_interval - 休息間隔
異常:
PocoNoSuchNodeException:元素不存在
9.long_click(duration=2.0)
長按
參數:
duration - 持續時間,默認2秒
10.swipe(direction, focus=None, duration=0.5)
滑動
參數:
direction - 滑動方向,可以是屏幕相對坐標或是指定方向'up', 'down', 'left', 'right'。'up'=[0, -0.1], 'down'=[0, 0.1], 'left'=[-0.1, 0], 'right'=[0.1, 0]。如[0, -0.1],指元素長的方向不動,整個屏幕寬-10%的位置,即基於元素中心點垂直向上。
focus - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即左上角,取值范圍0~1
duration - 滑動時長,默認0.5秒
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco('Scroll').swipe([0, -0.1]) # 從元素中心向上滑動屏幕寬10%的距離
poco('Scroll').swipe('up') # 從元素中心向上滑動屏幕寬10%的距離
# 從元素左上角向上滑動屏幕寬10%的距離,滑動過程持續3秒
poco('Scroll').swipe(direction='up', focus=[0.1,0.1], duration=3)
11.drag_to(target, duration=2.0)
將一個元素拖到另一個元素位置。類似於swipe,但swipe是滑動到一個指定方向,而drag_to則是滑動到一個點。
參數:
target - 一個元素對象或屏幕相對坐標
duration - 滑動時長,默認2秒
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco('star').drag_to(poco('shell')) # 將元素star拖到元素shell
poco('star').drag_to([0.1,0.1]) # 將元素star拖到屏幕左上角
12.scroll(direction='vertical', percent=0.6, duration=2.0)
滾動。在可以滾動的元素上進行滾動。
參數:
direction - 滾動方向,"vertical" or "horizontal",默認'vertical'
percent - 滾動距離,該距離是相對於此元素的高或寬的比例,默認0.6
duration - 滾動時長,默認2秒
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco('scroll').scroll() # 向下垂直滾動0.6的比例,持續2秒
poco('scroll').scroll(direction='vertical', percent=-0.6) # 向上垂直滾動0.6的比例,持續2秒
poco('scroll').scroll('horizontal',0.3,1) # 向右橫向滾動0.3的比例,持續1秒
13.pinch(direction='in', percent=0.6, duration=2.0, dead_zone=0.1)
縮放
參數:
direction - "in"縮 or "out"放,默認"in"
percent - 縮放距離,該距離是相對於此元素的比例,默認0.6
duration - 縮放時長,默認2秒
dead_zone - 縮放內圈半徑,不能大於percent,默認0.1
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco('picture').pinch() # 圖片向里縮小
poco('picture').pinch("out") # 圖片向外放大
14.start_gesture()
滑動手勢。可用於解鎖等復雜手勢操作。
返回:
PendingGestureAction實例
示例:
ui1 = poco('xxx')
ui2 = poco('yyy')
# 按住元素ui1 1秒,滑到ui2,等待1秒,滑到屏幕中心,等待1秒,抬起
ui1.start_gesture().hold(1).to(ui2).hold(1).to([0.5,0.5]).hold(1).up()
15.focus(f)
為元素重新聚焦。作用同click()等操作中的focus參數。一般定位到元素后默認焦點是該元素的中心點[0.5,0.5],使用
focus()可以重新聚焦。
參數:
f - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即左上角,取值范圍0~1
返回:
新的UIObjectProxy實例
示例:
poco('star').focus([0.1,0.1]) # 將焦點設為元素的左上角
16.get_position(focus=None)
獲取元素在屏幕上的相對坐標
參數:
focus - 元素相對坐標,如[0.1,0.1],指元素長、寬各10%的位置,即左上角,取值范圍0~1
返回:
相對坐標,如[0.498,0.35555]
異常:
PocoNoSuchNodeException:元素不存在
17.wait(timeout=3)
等待元素X秒,等到提前結束,等不到繼續往下
參數:
timeout - 等待時間,默認3秒
返回:
自身
示例:
# 等待star元素10秒。因為返回自身,所以可以繼續操作
poco('star').wait(10).click()
18.wait_for_appearance(timeout=120)
等待元素出現,等到提前結束,等不到報錯
參數:
timeout - 等待時間,默認120秒
異常:
PocoTargetTimeout:等待元素超時
示例:
star = poco('star')
star.wait_for_appearance(10)
star.click()
19.wait_for_disappearance(timeout=120)
等待元素消失,消失則提前結束,否則報錯
參數:
timeout - 等待時間,默認120秒
異常:
PocoTargetTimeout:等待元素超時
示例:
poco('star').wait_for_disappearance(10)
20.attr(name)
獲取元素屬性值
參數:
name - 屬性名稱,如name、type、text、visible、pos、clickable等
返回:
屬性值,如果屬性不存在返回None
異常:
PocoNoSuchNodeException:元素不存在
示例:
poco('star').attr("name")
21.setattr(name, val)
設置元素的屬性的值。需要注意的是並不是所有屬性都可以修改。
參數:
name - 屬性名稱,如name、type、text、visible、pos、clickable等
val - 值
異常:
InvalidOperationException:非法操作。當設置失敗時拋出。
示例:
# 給輸入框設置值為"測試工程師小站"
poco('input').setattr("text", "測試工程師小站")
22.exists()
判斷元素是否存在。
返回:
True if exists otherwise False
示例:
poco('input').exists()
23.get_text()
獲取元素'text'屬性值
返回:
'text'屬性值,沒有時返回None
示例:
poco('input').get_text()
24.set_text(text)
設置元素'text'屬性值
參數:
text - 文本內容
異常:
InvalidOperationException:非法操作。當無法設置時拋出。
示例:
poco('input').set_text("測試工程師小站")
25.get_name()
獲取元素'name'屬性值
返回:
'name'屬性值
示例:
poco('input').get_name()
26.get_size()
獲取元素在屏幕相對坐標中的大小
返回:
[width, height] in range of 0 ~ 1
示例:
poco('input').get_size()
27.get_bounds()
獲取元素在屏幕相對坐標系中的邊界
返回:
[top, right, bottom, left] in range of 0 ~ 1
示例:
poco('input').get_bounds()
28.refresh()
poco1.0.87新增接口,主要用在如下場景:
如定義一個元素,此時元素存在,循環去操作
a = poco(text="日歷")
for i in range(10):
print(a.get_text())
假如在循環到第5次時,元素消失了,但因為變量a是不變的,所以能一直獲取其這個元素。
使用refresh()可解決此問題:
a = poco(text="日歷")
for i in range(10):
a.refresh()
print(a.get_text())
這樣,在第5次以后,由於元素消失,就不會獲取到元素文本了。
同樣的,如果一個元素一直存在,你要判斷其是否消失了,也可以用這個方法。
詳情可看:Poco API精講之refresh()
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~