真香系列!用正则表达式匹配poco控件,学会了秒杀各种定位选择器

简介: 真香系列!用正则表达式匹配poco控件,学会了秒杀各种定位选择器

前言



你是不是经常遇到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分钟入门文章deerchao.cn/tutorials/r…


另外,当同学们撰写了1个正则表达式,想知道它是否能到匹配到预期目标时,我们还可以简单地在线测试下匹配结果,比如使用这个 正则表达式的匹配网站tool.oschina.net/regex/


网络异常,图片无法展示
|


小结



今天的教程就到这里啦!最后附上核心知识点的思维导图,同学们下次做控件定位的时候,不妨考虑使用正则表达式,说不定会有更惊喜的效果哦~


网络异常,图片无法展示
|

相关文章
|
机器学习/深度学习 Shell C++
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
301 0
|
C#
正则表达式——WPF输入控件TextBox 限定输入特定字符
原文:正则表达式——WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2189 0
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r'string'`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
64 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
6月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
6月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
6月前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
64 2
|
6月前
|
Python
Python正则表达式详解:掌握文本匹配的魔法
Python正则表达式详解:掌握文本匹配的魔法
|
6月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
49 0