当前位置: 首页 > news >正文

自动测试框架airtest应用一:将XX读书书籍保存为PDF

一、Airtest的简介

  Airtest是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的,计算机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序,这是Airtest的一部分。
  另外,Airtest也基于poco这个U控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium,通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。

     更多介绍可参考官网和关于Airtest的使用探索

二、准备

首先为了方便我们编写脚本,查看UI元素以及调试,我们需要下载AirtestIDE。

其次我们需要使用iOS-Tagent在手机上创建一个WebDriver服务器,可用于远程控制iOS设备,定位UI元素。clone相关代码后,在Xcode里选择WebDriverAgentRunner这个target,然后使用Test模式编译运行。这时候手机会进入Automation Running模式。

第三步,我们要将手机的8100端口映射到电脑的8100端口。

iproxy是usbmuxd附带的一个小工具,它的作用是将设备的某个端口映射到电脑的某个端口。mac下可以通过brew安装 brew install usbmuxd

iproxy 8100 8100 意思就是将手机的8100端口,映射到电脑的8100端口上。这样我们就能通过访问电脑的8100端口来访问到手机了。

对于Windows用户而已,这一步也可以使用tidevice和wdaproxy代替[参考]。

这时候我们就可以在AirtestIDE右下角点击connect按钮,成功的话,就会在右侧显示设备的图像。

接着我们就可以在代码编辑区编写代码了。

三、脚本编写

想象一下我们接下去要进行的步骤:1.启动应用,开始截图,然后翻页,再截图......直到翻完为止。首先我们遇到的问题就是如何启动应用。一个做法是我们可以使用poco("应用名称")。如果它正好在当前屏幕内,我们可以使用poco("应用名称")找到要点击元素的位置,然后通过click()来模拟点击它,这样应用就启动了。但是如果它不在当前屏幕,那就走不通,需要变通一下。我们应该先回到home,然后再滚动到这一页。这样看起来比较麻烦,有没有更直接的办法呢?那就需要使用airtest.core.api中的start_app("bundle-id"),这个api需要指定一个应用的bundle id。

应用启动之后,我们就可以使用snapshot截屏。为了方便我们管理图片,我们需要给产生的截屏指定保存的路径:

snapshot(filename="/Users/xxx/Desktop/book/1.png")

截完图后我们需要模拟翻到下一页,这里我们使用swipe方法:

swipe(v1=(300,900), vector=[-0.2365, 0.0053])

swipe方法需要指定从哪个位置开始滚动多少距离,距离是一个包含xy两个值的向量,而且是屏幕大小的比例值。

最后我们要判断翻页是否结束。考虑到每本书看完之后,都会有"全书完"三个字,并且下面有一个完的图标,于是我们选择将这个整体作为判断的标志。点击左侧Airtest assist里的exists方法,这时候代码插入编辑区,并且提示我们选择要识别的区域。我们使用鼠标在右侧设备实时屏幕中选中该区域。这时候这块区域的截图会插入代码中:

 最后我们可以通过Python的fitz库来将多张图片合并成一个PDF文件。可以看到效果还是可以的:

四、总结

        最后,也要考虑到该方案存在的一些问题,譬如说会把这个圆形按钮截图截进去,当然我们可以在辅助中将其关闭。考虑到一本书的页面较多,使用该方法将一本书完整截图截下来,需要耗费不少时间。其间手机顶部可能会出现不少推送消息,遮挡住书籍内容本身。最后,考虑到版权因素,该方案仅供学习交流之用,请勿用于传播。本文通过一个截屏保存电子书籍的趣味小例子,学习、掌握自动化测试框架Airtest的基本使用。

http://www.lryc.cn/news/119605.html

相关文章:

  • ValueError:The following settings are not supported :{‘username‘: ‘neo4j“}
  • 360安全卫士右下角广告弹窗太多怎么彻底关闭?
  • 链表有无环以及确定入环口详解
  • chrome插件开发实例08- 使用Vue.js开发chrome插件
  • PCL 计算外接圆的半径
  • Matlab实现神经网络SOM算法(附上完整仿真源码)
  • 【遍历】非递归法 二叉树的前中后序遍历
  • Python将tiff转换成png
  • 【大数据】-- 部署 Flink kubernetes operator
  • 能够完成两个数的算术运算的单地址指令,地址码指明一个操作数,另一个操作数来自( )方式
  • 数据库数据恢复-Oracle数据库数据恢复案例
  • 对于msvcr120.dll丢失的问题,分享几种解决方法
  • 网络安全进阶学习第十三课——SQL注入Bypass姿势
  • vue3 provide inject实现强制刷新
  • Neo4j笔记-数据迁移(导出/导入)
  • 请求转发和请求重定向
  • TOMCAT的多实例部署和动静分离
  • 阿里微服务seata组件tc告诉rm进行提交的时候,rm提交失败了seata怎么办呢?
  • 已解决 RuntimeError: There is no current event loop in thread ‘Thread-1‘.
  • Android的学习系列之Android Studio Setup安装
  • Python测试框架pytest:常用参数、查找子集、参数化、跳过
  • Android 13 Hotseat定制化修改
  • 【VUE】7、VUE项目中集成watermark实现页面添加水印
  • Rider无法识别Todo Comment
  • 用 docker 创建 jmeter 容器,能做性能测试?
  • Token 失效退出至登录页面
  • 微服务系列(2)--注册中心
  • VSCode使用CMake断点调试
  • Python爬虫异常处理心得:应对网络故障和资源消耗
  • 【CSS】CSS 布局——常规流布局