此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

1. 前言

很多新手同学在学习Poco测试框架的时候,会经常遇到一些关于控件定位脚本的问题。比如,上一秒还能正常运行的控件定位脚本,下一秒就报错找不到控件了;再比如,明明不同手机上装的都是同一款应用,但就是有些手机报找不到控件…

这一种种“诡异”的情况,都让我们百思不得其解。所以今天的推文内容,我们将详细地跟大家分享下在编写Poco定位脚本时,我们可以用到的一些实用技巧,超长干货,同学们一定要mark住哦!

2. 生成Poco定位脚本的多种方式

在了解Poco定位脚本的编写技巧之前,我们先来细细回顾一下,我们可以通过哪些方式来“生成”1条Poco定位脚本。

1)单步录制-双击节点

在AirtestIDE连接上设备之后,打开待测应用,随后在IDE的Poco辅助窗中选择对应的Poco模式,等待UI树刷新出来:

利用检索按钮检索到目标控件之后,双击 UI树上的该节点,IDE即可帮助我们自动在脚本编辑窗里面自动生成1条控件定位脚本:

2)单步录制-右键选择UI path code

同上,在IDE的Poco辅助窗刷新出控件树之后,单击选中我们的目标节点,然后单击鼠标右键,选择 UI path code,IDE的脚本编写窗口就会自动帮我们生成1条控件定位脚本:

3)自动录制

另外,IDE还提供像录制Airtest脚本一样的,自动录制Poco脚本的功能:

单击Poco辅助窗的录制功能,然后随着我们对设备画面的操作,IDE会自动在脚本编写窗口录制下来我们的Poco操作脚本。

4)手动编写-根据3种定位选择器

除了使用IDE给我们提供的各种录制方式之外,我们还可以根据各种控件定位规则,手动编写Poco定位脚本。

Poco给我们提供了3种定位选择器,分别是:

  • 基本选择器:根据控件的属性和属性值来进行定位,常见的比如name属性、text属性等
  • 相对选择器:根据控件之间的渲染层级关系来进行定位,常见的关系比如父子关系、兄弟关系等
  • 空间顺序选择器:按照控件的空间排布顺序,从左到右,从上到下,添加索引值来进行控件定位

我们在定位脚本时,可以仅仅使用其中一种定位选择器,也可以混合使用多种定位选择器来编写控件的定位脚本,详细的介绍可以查看我们的往期推文 poco的元素定位搞不定?速来看看这3个选择器 。

下面我们提供一些利用这3种选择器进行示例脚本:

# 使用基本选择器的poco定位脚本
poco(text="每日推荐")# 使用相对选择器的poco定位脚本
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/swipeToRefreshView").child("com.netease.cloudmusic:id/recyclerView")# 使用控件顺序选择器的poco定位脚本
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/swipeToRefreshView").child("com.netease.cloudmusic:id/recyclerView")[0]
5)手动编写-根据正则匹配表达式

除了上述3种定位选择器之外,我们还支持使用正则匹配表达式来匹配我们的Poco控件。

在部分情况下,使用正则匹配表达式来匹配Poco控件,会使得我们的定位脚本更加简洁省事。

这里简单列举几个使用正则表达式匹配控件的脚本:

# 匹配控件的name属性
poco(nameMatches="com.*?songInfo")# 匹配控件的text属性
poco(textMatches=".*淘宝")

关于利用正则匹配表达式来匹配控件的详细内容,也可以参考我们的往期推文 真香系列!用正则表达式匹配poco控件,学会了秒杀各种定位选择器 。

其中我们需要记住的最重要的一点是:只要能够用 poco(xx=预期属性值) 来选择的控件,就可以用 poco(xxMatches=预期属性值的正则表达式) 来进行匹配定位。常见的如常 textMatchesnameMatchestypeMatches等等。

3. 生成高效、兼容性好的Poco脚本技巧

那简单了解完“生产”Poco定位脚本的各种方式之后,我们再来聊一聊其中的一些技巧。

1)尽量不要完全依赖自动录制

尽管我们的IDE提供了自动录制Poco脚本的功能,但是我们还是希望同学们不要过于依赖自动录制出来的Poco脚本。

我们更建议大家在学习Poco脚本的初期使用这个功能,来更好的熟悉我们的Poco脚本长什么样子,把录制的脚本作为参考。

这是因为自动录制的Poco脚本,并不完全是正确的、或者是优秀的Poco脚本,有时候我们录制下来的Poco脚本并不能成功回放出来我们期望的效果,或者因为层级过于复杂导致运行效率很低。

举个例子:

poco(text="每日推荐").click()
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/daily_rv").child("com.netease.cloudmusic:id/musicListItemContainer")[0].child("com.netease.cloudmusic:id/songItemVideoBtn").click()
poco("转到上一层级").click()

这3条是自动录制出来的Poco脚本,我们可以对每一条简单分析下:

① 第一条就是很标准的利用text属性进行定位的脚本,没什么疑问,只要text属性在当前页面是唯一的,那就没有很大的问题;

② 第二条就是非常典型的,录制出来的层级过于复杂的脚本,这里涉及了三四层的相对关系,还带有空间索引,很容易出现运行效率差,或者因为索引值变化而导致出现找不到控件的问题;这种定位脚本我们使用过程就需要慎重考虑了,最好更换成别的更加简洁清爽的定位方式;

③ 第三条是录制出来的一个返回上一个页面的Poco定位脚本,这种情况更好的方式是不使用Poco定位脚本,替换成 keyevent("BACK") ,更加简单而且稳定。

我们列举这个例子,就是为了说明,录制功能虽然很“小白”,但是我们还可以将录制出来的Poco脚本优化成更加优秀的脚本,所以同学们不要过去依赖这个录制功能。

2)减少使用UI path code方式单步录制的脚本(效率低、易出错)

上文我们介绍了如何在IDE中右键单击UI树的控件,然后选择 UI path code 来生成1条控件定位脚本,但其实,我们并不是非常建议这种方式生成的定位脚本。

举个例子,我们以点击桌面上的网易云音乐图标为例,分别用右键UI path code的方式和双击节点的方式生成定位脚本,并分别单独运行查看效果:

poco("com.mumu.launcher:id/workspace").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.widget.TextView")[8].click()poco(text="网易云音乐").click()

可以看到,UI path code方式生成的脚本是以复杂的层级关系来定位的,并且包含空间索引,不如直接使用text属性来进行定位的脚本那么简洁,还更容易出错,所以非必要情况下,我们不那么建议使用这种方式生成定位脚本。

当然,右键UI path code方式生成的脚本并不一定都是会出错的脚本,这里仅列举了1个容易出错的例子,方便说明。

3)多使用控件的text之类的属性提高效率

我们刚才讲了很多次不建议使用复杂的层次关系(族谱)来进行定位,那么更加建议的方式是什么呢?其实就是使用元素的属性值来定位脚本。

举个例子,假设我们想要点击网易云音乐首页的“每日推荐”控件,利用文本属性编写定位脚本的话,将非常简洁,效率也会更高,不用管它复杂的层级关系以及空间索引顺序:

触类旁通,使用1个节点的某个属性值,不仅仅指text属性,还可以是name属性或者其它属性,只要它在当前页面是唯一的,那么我们就可以利用这个属性来定位到我们的控件;甚至借助节点的多个属性值来进行精准定位控件,都是可以的。我们非常建议大家多使用这种方式来编写我们的Poco定位脚本。

4)推荐使用正则表达式匹配控件

我们非常推荐同学们多使用正则表达式来匹配控件,特别是对于一些层次关系非常复杂的控件,使用正则表达式来匹配,会非常简洁高效。

举个例子,假设我们希望获取当前页面所有歌曲的详细介绍信息,如果使用之前介绍的定位方式,脚本可能如下:

可以看到,利用基本选择器和相对选择器写出来的定位脚本,看起来非常繁琐,而且我们还需要非常 精确地了解其中的层级关系 ,否则定位脚本就很容易出错。

那么我们试试换成正则表达式的定位方式:仔细观察UI树发现,这些歌曲信息的控件名都是一样的,所以只要我们写1个正则表达式,匹配到这一批相同的控件名,就相当于定位到了当前页面所有的歌曲信息控件,接下来就可以利用poco遍历,逐一获取控件的text属性了:

是不是非常简洁高效呢!

4. 小结

那今天的教程内容到这里就结束了,我们总共介绍了5种生产脚本的方式,以及4种编写Poco脚本的小技巧,通过下述的思维导图,可以帮我们快速了解整个文章的大致内容:

后续有更多的关于Poco脚本的编写技巧,我们还会持续跟大家进行分享,希望大家动动手指帮忙点个赞或者在看呗~


Airtest 官网:http://airtest.netease.com/
Airtest 教程官网:https://airtest.doc.io.netease.com/
搭建企业私有云服务:https://airlab.163.com/b2b

官方答疑 Q 群:654700783

呀,这么认真都看到这里啦,帮忙点个赞或者收藏支持下我把,灰常感谢~

如何生成高效、兼容性好的Poco定位脚本相关推荐

  1. CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板

    C#生成sql视图的实体类 using System; using System.Text; using CodeSmith.Engine; using SchemaExplorer; using S ...

  2. css 定位兼容性,CSS基础:定位与浏览器兼容性

    position属性 介绍: CSS position属性用于指定一个元素在文档中的定位方式.top,right,bottom 和 left 属性则决定了该元素的最终位置. position 属性值 ...

  3. 精度厘米级,高效低成本的室内外精准定位和AR导航

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 自1967年卫星导航技术开放民用以来,经过50多年发展,导航定位已广泛应用于交通物流.地理信息.高精度 ...

  4. AirTest Poco定位 和启动方式

    感谢George大佬的文章 让我明白的poco的定位常用使用方式 这是大佬的公众号 好了我要我把学的都记下来防止自己忘记 没办法记性不好 难搞哦 1.app启动方式 包名方式启动start_app(& ...

  5. 生成word文件痕迹列表,定位光标到痕迹所在页

    就目前公司开发过的几个项目中,都涉及到了文档的在线编辑处理,这个功能好实现,目前网上可以搜出不少在线编辑office的文件的控件和中间件,不管免费的还是收费的产品,公司也试用了不少,后来发现soaof ...

  6. airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

    一:主要内容 框架功能.框架架构及测试报告效果 airtest安装.环境搭建 框架搭建.框架运行说明 框架源码 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的项目的前端自动化, ...

  7. JNI调用本地库时JAVA虚拟机异常退出问题定位,通过虚拟机生成的hs_err_pidxxx.log日志文件定位过程...

    JAVA代码中有一处需要通过JNI调用本地的DLL库,每次一到这里整个程序就直接闪退,程序目录下有生成的虚拟机日志文件hs_err_pidxxx.log,相同的程序运行在别的机器上都没有问题,刚开始无 ...

  8. python找人脚本_女朋友最近天天加班,用python写个定位脚本,直接抓到现场

    近期,小伙女朋友一反常态,经常晚回家,就说有事,其他什么也不肯说: 于是他找上我,问我在他女朋友在外面那段时间能不能定位一下她在哪个地方: 这必须得安排上啊,下面看具体操作方式: 第一步:IP地址 I ...

  9. 女朋友突然天天加班,用python写个定位脚本,直接抓到现场

    近期,小伙女朋友一反常态,经常晚回家,就说有事,其他什么也不肯说: 于是他找上我,问我在他女朋友在外面那段时间能不能定位一下她在哪个地方: 这必须得安排上啊,下面看具体操作方式: 第一步:IP地址 I ...

最新文章

  1. 使用maven+eclipse搭建最简单的struts2的HelloWorld
  2. 工信部制定VR行业标准-谋定研究:对话中国经济和信息化
  3. 设计模式:依赖倒置原则
  4. md5模式 签名_MD的完整形式是什么?
  5. java.util.concurrent.BlockingQueue指南
  6. Android之播放一首简单的音乐
  7. 10右键闪退到桌面_windows7多用户远程桌面如何设置
  8. python标准库——random模块
  9. 计算机为动态分区无法安装系统,采用gpt分区无法安装系统怎么办
  10. 将WinPE安装至硬盘
  11. 办公室服务器文件管理制度,机要文件管理制度
  12. 如何使用gitee(码云)提交,拉取管理项目代码
  13. oracle快照点,Oracle快照(snapshot)管理
  14. Shell按关键字删除重复行
  15. STM32小项目之ds18b20测温在oled上显示
  16. php发送消息给telegram,PHP对接telegram
  17. SPI-flash模拟U盘
  18. 微信小程序H5预览页面框架
  19. 【Javascript】javascript 中的指针
  20. 全网手机号码归属地号段总数量70W条

热门文章

  1. 国产银河麒麟系统V10忘记密码重置操作
  2. 类的封装与对象数组-随机点名器
  3. Android win10 平板 省电,小编解答win10系统Mobile设置更省电的图文办法
  4. 创芯科技-CAN收发器使用
  5. 服务器CPU占用过高如何解决
  6. 数学建模之稳定性模型详解
  7. 联想G460笔记本触摸板驱动 For Windows 7 x64
  8. 【LaTeX】LaTeX打取整符号
  9. Java8 stream流式表达式用法
  10. Python游戏概率补偿算法-马尔科夫链