前言
你是不是經常遇到poco定位腳本太長而報錯的情況?是不是經常為了那些復雜的控件層級關系而頭疼?如果是的話,今天的推文你一定不能錯過啦!
先來簡單回顧下我們之前在 “poco的元素定位搞不定?速來看看這3個選擇器”這篇推文中,詳細跟大家介紹過poco定位元素的3種選擇器:
- ① 基本選擇器:根據節點的屬性及預期的屬性值來進行定位,eg:
poco(name="淘寶")
- ② 相對選擇器:利用元素之間的渲染層級關系進行選擇,eg:父子關系、兄弟關系等,
poco("plays").child("playBasic")
- ③ 空間選擇器:根據元素索引順序,逐個選中單個元素,eg:
poco("Content").child(type="Text")[0]
其實除了上述3種常規一點的定位方式之外,還有一種同學們比較少見,但是非常好用的定位方式,那就是 用正則表達式來匹配控件 ,如下述示例這樣:
# select the UI element(s) which text attribute matches the pattern '^close.*$' poco = Poco(...) arb_close_btn = poco(textMatches='^close.*$')
這種定位方式,用起來非常簡單省事。下文我們將詳細跟大家介紹下具體如何利用正則表達式來匹配目標的poco控件,以及文末我們還給大家推薦了1個正則表達式的上手教程和檢測正則表達式是否正確的工具,希望大家可以認真閱讀哦!
利用正則表達式匹配poco的控件
我們從1個簡單的例子來了解下正則表達式匹配poco控件的用法:
這是淘寶APP的icon控件,利用基本選擇器,我們可以使用 poco(text="手機淘寶")
這樣的方式來定位到這個淘寶的icon控件。
換成正則表達式來匹配這個控件的話,我們可以使用如下方式來進行匹配:
poco(textMatches="能匹配到手機淘寶的正則表達式")
能匹配到“手機淘寶”的正則表達式有很多,例如 .*淘寶
,這個就是能匹配到“手機淘寶”的1個正則表達式,所以點擊手機淘寶icon控件的語句我們可以寫成如下的形式:
poco(textMatches=".*淘寶").click()
除了使用 textMatches
以外,同理我們還可以使用 nameMatches
來匹配控件的name屬性等:
利用基本選擇器定位圖中控件,我們可以這么編寫定位腳本:
poco(name="com.netease.cloudmusic:id/portalTitle",text="每日推薦")
而換成正則表達式的匹配方式,則可以這么實現:
poco(nameMatches=".*portalTitle",textMatches=".*推薦")
另外在做層次特別深的一些定位時,使用正則表達式來匹配,會非常簡潔高效:
如上圖所示,我們希望獲取當前頁面所有歌曲的詳細介紹信息,如果使用之前介紹的定位方式,腳本可能如下:
for i in poco("com.netease.cloudmusic:id/pagerListview").child("com.netease.cloudmusic:id/musicListItemContainer"): info = i.child("com.netease.cloudmusic:id/songNameAndInfoArea").offspring("com.netease.cloudmusic:id/songInfo") print(info.get_text())
可以看到,利用基本選擇器和相對選擇器寫出來的定位腳本,看起來非常繁瑣,而且我們還需要非常精確地了解其中的層級關系,否則定位腳本就很容易出錯。
那么我們試試換成正則表達式的定位方式:仔細觀察UI樹發現,這些歌曲信息的控件名都是一樣的,所以只要我們寫1個正則表達式,匹配到這一批相同的控件名,就相當於定位到了當前頁面所有的歌曲信息控件,接下來就可以利用poco遍歷,逐一獲取控件的text屬性了:
for i in poco(nameMatches="com.*?songInfo"): print(i.get_text())
除了最常見的 textMatches
、 nameMatches
和 typeMatches
,其實大部分的屬性都可以用這種方式來傳遞正則表達式,只要能夠用 poco(xx=預期屬性值)
來選擇的控件,就可以用 poco(xxMatches=預期屬性值的正則表達式)
來進行匹配定位。
相關教程和工具推薦
如果同學們需要正則表達式的上手教程,我們推薦大家閱讀這篇比較經典的 正則表達式30分鍾入門文章 :https://deerchao.cn/tutorials/regex/regex.htm 。
另外,當同學們撰寫了1個正則表達式,想知道它是否能到匹配到預期目標時,我們還可以簡單地在線測試下匹配結果,比如使用這個 正則表達式的匹配網站 :https://tool.oschina.net/regex/ 。
小結
今天的教程就到這里啦!最后附上核心知識點的思維導圖,同學們下次做控件定位的時候,不妨考慮使用正則表達式,說不定會有更驚喜的效果哦~
AirtestProject官方答疑Q群:1017250147
Airtest官網:http://airtest.netease.com/
Airtest教程官網:https://airtest.doc.io.netease.com/
搭建企業私有雲服務:https://airlab.163.com/b2b