uiautomator2 使用
初始化
部署相关的守护进程。
电脑连接上一个手机或多个手机, 确保adb已经添加到环境变量中,执行下面的命令会自动安装本库所需要的设备端程序:uiautomator-server 、atx-agent、openstf/minicap、openstf/minitouch
python -m uiautomator2 init
安装完成,设备上会多一个uiautomator的应用(ATX)。打开页面如下:
测试
编写以下脚本进行验证:
python import uiautomator2 as u2 d = u2.connect('10.59.8.231')//查看手机连接IP地址 print(d.info) //打印手机信息 exit() //退出python
运行结果:
定位元素:
我们可以借助Android SDK自的uiautomatorviewer查看元素,这就要求手机必须以USB的方式连接PC,我前面使用的是WIFI连接进行连接的。所以,openatx提供了另外一个工具weditor 来解决这个问题。
GitHub地址:https://github.com/openatx/weditor
1、安装:
pip install --pre --upgrade weditor
安装成功如下:
2、使用:
python -m weditor
默认会自动通过浏览器打开页面:http://localhost:17310/
在页面左上角选择Android,输入设备IP(10.59.8.231),点击Connect按钮。
当我们操作完手机后,可以点击“Dump Hierarchy”按钮进行刷新,从而保持与设备上的界面保持同步。weditor 还可以帮我们生成代码。待研究~
小结:这里基本不会有什么坑,按照以上流程会ok~
编写测试脚本
这里直接从这里拿过来,后面待细细研究
import uiautomator2 as u2 from time import sleep d = u2.connect('192.168.31.234') # 启动App d.app_start("com.meizu.mzbbs") # 搜索 d(resourceId="com.meizu.mzbbs:id/j0").click() # 输入关键字 d(resourceId="com.meizu.mzbbs:id/p9").set_text("flyme") # 搜索按钮 d(resourceId="com.meizu.mzbbs:id/tp").click() sleep(2) # 停止app d.app_stop("com.meizu.mzbbs")
app_start()和app_stop()用于启动和停止应用。
常用的定位方式:
-
ResourceId定位:
d(resourceId="com.meizu.mzbbs:id/tp").click() -
Text定位:
d(text="精选").click() -
Description定位:
d(description="..").click() -
ClassName定位:
d(className="android.widget.TextView").click()
原文地址:https://www.cnblogs.com/helloTerry1987/p/11440819.html
- tensorflow载入数据的三种方式 之 TF生成数据的方法
- JS游戏开发 可移动地图的实现
- Java面试系列-多线程
- pymongo.errors:Sort operation used more than the maximum 33554432 bytes of RAM. Add an index,
- PG学习初体验--源码安装和简单命令(r8笔记第97天)
- Pymongo: TypeError: if no direction is specified, key_or_list must be an instance of list
- Java面试系列19-Struts2
- JS游戏开发,让你的静态人物动起来(来自网路)
- Golang语言websocket源码
- 社团划分——Fast Unfolding算法
- 【PSU】AIX 11g RAC自动打GI PSU5
- 详解自动识别验证码,LSTM大显身手
- 智能算法——PageRank
- 【Go 语言社区】Golang 可变参数的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用iptable和Firewalld工具来管理Linux防火墙连接规则
- 如何使用Flutter开发一款电影APP详解
- Linux获取10个你最常用的终端命令列表
- Flutter banner_view 轮播图的使用及实现代码
- Linux下截屏并编辑的最佳工具
- Android Native 内存泄漏系统化解决方案
- flutter ExpansionTile 层级菜单的实现
- Ubuntu下如何创建XFS文件系统的LVM详解
- 华为开源内部OpenJDK定制版:“毕昇 JDK 8”
- Linux定时任务Crontab命令使用详解与总结
- kotlin实现通知栏提醒功能示例代码
- Linux自动删除n天前日志及实例命令
- Flutter学习教程之Route跳转以及数据传递
- PHP实现限制域名访问的实现代码(本地验证)
- 吸引发烧友的视听Linux发行版