Poco UI對象 API匯總


上期回顧: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()

 

---------------------------------------------------------------------------------

關注微信公眾號即可在手機上查閱,並可接收更多測試分享~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM