uiautomator2快速入门app自动化测试教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、环境准备
    • 1.安装软件
    • 2.安装库
  • 二、adb 连接手机
    • 1. 准备工作
    • 2. 第一种连接方式:USB连接
    • 3. 第二种连接方式:WLAN连接
    • 4. 第三种连接方式:WiFi连接
    • 5.查看端口转发
  • 三、uiautomator2 连接手机
    • 1. 前期准备
    • 2. 默认连接
    • 3. WIFI 地址连接
    • 4. 解决 Uiautomator not starting 问题
  • 四、uiautomator2 的使用
    • 1. 安装、卸载
    • 2. 启动、关闭、清除
    • 3. 获取APP包名
    • 4. 设备操作
    • 5. 按键操作
  • 五、元素
    • 1. 元素定位辅助工具weditor
    • 2. 元素(控件)构成
    • 3. 元素(控件)定位方式
    • 4. 通过上下级关系去定位元素
    • 5. 点击操作
    • 6. 滑屏操作
    • 7. 输入和清空
    • 8. 截屏操作
    • 9. 元素等待


前言

本文章需要会 python 基础语法,课程目标是熟练使用 uiautomator2 库进行 android 自动化测试。


一、环境准备

1.安装软件

  • python3
  • pycharm社区版
  • 安卓手机或模拟器
  • adb
    提示:需要配置相应的环境变量

2.安装库

##打开cmd面板,安装以下库
pip install uiautomator2
pip install setuptools

二、adb 连接手机

1. 准备工作

  1. 在“设置-我的设备-全部参数”找到手机版本,连续点击7次会进入开发者模式
  2. 进入开发者选项页面,把USB调试、USB安装都打开,然后才能正常的进行连接。

2. 第一种连接方式:USB连接

需要用可以传输数据的数据线连接手机和电脑,会弹窗选择连接方式(仅充电、传文件等等),选择传文件。然后用adb命令查看连接设备 adb devices -l ,能看到设备信息就说明已连接到设备可以正常调试设备了,否者可能是开发者模式没打开。

adb devices -l 

3. 第二种连接方式:WLAN连接

  1. 这种方式适用于Android版本10及一下的手机,需要借助USB。首先要确保手机和电脑在同一个局域网内(连接同一个WiFi),其次需要在开发者选项里面将无线连接打开,进入可以查看到手机设备的IP,并且通过USB连接手机和电脑。
  2. 用adb命令设置手机监听 adb tcpip 5555
#需要usb连接手机才能开启
adb tcpip 5555 
  1. 然后就可以拔掉USB了,执行命令adb connect 手机ip:5555
#通过手机无线网查看ip地址
adb connect 192.168.1.178:5555
  1. 然后用adb命令查看连接设备 adb devices -l ,能看到设备信息就说明已连接到设备可以正常调试设备了
adb devices -l 

4. 第三种连接方式:WiFi连接

  1. 这种方法适用于Android版本11及以上,adb --version ≥ 30.0.0的条件使用。首先要确保手机和电脑在同一个局域网内(连接同一个WiFi),要把开发者模式和无线调试模式,选择使用配对码配对,需要记下配对码、IP 地址和端口号。
#查看 adb 版本号
adb --version
  1. 运行命令adb pair 手机ip:端口号,进入下一步,根据提示输入配对码,系统会显示配对成功
adb pair 192.168.1.179:45893
# Enter pairing code: 840322
  1. 执行命令adb connect 手机ip:端口号 ;
# 和配对的端口号不一样
adb connect 192.168.1.179:39635
  1. 然后用adb命令查看连接设备 adb devices -l ,能看到设备信息就说明已连接到设备可以正常调试设备了。
adb devices -l 

5.查看端口转发

adb forward --list

三、uiautomator2 连接手机

1. 前期准备

打开手机软件 ATX,启动 UIAUTOMATOR

2. 默认连接

import uiautomator2 as u2
#仅当只一个的时候可以使用
device = u2.connect()
#通过序列号连接
device = u2.connect('U4HA6HXK7XEY65BY') 
#通过wifif去接链接
device = u2.connect('http://192.178.1.178:7912')
device = u2.connect('http://192.178.1.178')

3. WIFI 地址连接

import uiautomator2 as u2
device = u2.connect_wifi('192.178.1.178:7912')
device = u2.connect_wifi('192.178.1.178')

4. 解决 Uiautomator not starting 问题

先试用adb devices查询到设备
再使用命令python -m uiautomator2 init在模拟器上安装ATX
打开ATX,启动UIautomator,提示Uiautomator not starting,
解决办法:

adb shell
chmod 755 /data/local/tmp/atx-agent
data/local/tmp/atx-agent version # 查看版本
/data/local/tmp/atx-agent server -d # 启动atx-agent并切换到后台运行

参考链接:https://www.jianshu.com/p/b002f4505aee

四、uiautomator2 的使用

1. 安装、卸载

import uiautomator2 as u2
device = u2.connect("emulator-5554")
#APP柠檬浏览器 的下载地址
url = "https://dl.byhh.net:2333/6_83698"
#安装 APP柠檬浏览器
device.app_install(url)
# 打开APP
device(text='柠檬浏览器').click()
# 获取APP信息
appInfo = device.app_current()
print(appInfo )
# 卸载 APP(包名)
device.app_uninstall("com.ss.android.article.browser")

2. 启动、关闭、清除

import uiautomator2 as u2
device = u2.connect("emulator-5554")
# 打开APP
device.app_start("com.ss.android.article.browser")
# 关闭 APP
device.app_stop("com.ss.android.article.browser")
# 清除APP 数据
device.app_clear("com.ss.android.article.browser")

3. 获取APP包名

# 1.通过代码获取APP包名
# 获取当前运行的APP包名
appInfo = device.app_current()
# 获取正在运行的APP 所有包名
appInfos = device.app_list_running()

4. 设备操作

import uiautomator2 as u2
device = u2.connect("emulator-5554")
# 获取设备相关信息
info = device.info
# 获取设备更多信息
deviceInfo = device.device_info
# 屏幕大小
windosSize = device.window_size()
# 截屏操作
device.screenshot("test.png")
# 将电脑文件推送到手机
device.push('test.txt','/data/')
# 将手机文件拉取到电脑
device.pull('/data/test.txt','./text2.txt')

5. 按键操作

import uiautomator2 as u2
device = u2.connect("emulator-5554")
# 亮屏
device.screen_on()
# 熄屏
device.screen_off()
# 音量加/减
device.press("volume_up")
device.press("volume_down")
# 静音
device.press("volume_mute")
# 最近的程序
device.press('recent')
# 电源键
device.press("power")
## 其它对应的press 可进行百度查询

五、元素

1. 元素定位辅助工具weditor

# 方法一:安装weditor 
pip install weditor
# 方法二:安装weditor
git clone https://github.com/alibaba/web-editor
pip3 install -e web-editor
# 启动 weditor
weditor

weditor 对比其它工具:uiautomatorviewer

  • 可以周管理多个设备
  • 直接在调试界面操作手机
  • 自动生成uiauotmator代码

2. 元素(控件)构成

  • 控件名称
  • 控件属性(特征)resourceId,className,description,text 等
  • 子控件

3. 元素(控件)定位方式

  • text,textContains,textMatches,textStartswith
  • className,classNameMatches
  • description,descriptionContains,descriptionMatchs,descriptionStartwith
  • checkable,enabled,clickable,longclickable
  • scrollable,enabled,forcusable,focused,selected
  • packageName,packageNameMatches
  • resourceId,resourceIdMatches
  • index,instance

提示:Contains(包含)Matches(正则表达式)Startswith(开头是)instance(索引)

4. 通过上下级关系去定位元素

import uiautomator2 as u2
d = u2.connect("emulator-5554")
# child 子元素
d(className="android.view.ViewGroup").child(text="柠檬浏览器").click()
# sibling 同级元系
d(text="ATX").sibling(text="柠檬浏览器").click()
# 根据页相对位置(速度较慢)
# left,左边的元素
d(text="ATX").left().click()
# right,右边的元素
# up,上面的元素
# down,上面的元素

5. 点击操作

import uiautomator2 as u2
d = u2.connect("emulator-5554")
# 1.通过定位元素点击
d(text="柠檬浏览器").click()
# 2.通过全局坐标点击
d.click(189,234)
# 3.通过百分比点击
d.click(0.123,0.934)

6. 滑屏操作

import uiautomator2 as u2
d = u2.connect("emulator-5554")
# 像素位置(startX, startY, endX, endY)
d.swipe(800,500,100,500)
# 滑动百分比(方向,百分比)
d.swipe('left',scale = 0.9)
# 定位元素,再使用元素对象滑动 (方向,滑动时间)
e = d(text="柠檬浏览器")
e.swipe('left',steps= 100)

7. 输入和清空

# 输入
d.send_keys("1234566")
# 睡眠
d.sleep(3)
# 清空
d.clear_text()

8. 截屏操作

import uiautomator2 as u2
d = u2.connect("emulator-5554")
from PIL import IMAGEFILTER
# 1.直接截屏
d.screenshop('dest.png')
# 2.截屏对像 pillow
img = d.screenshop()
img.save('test.png')	#保存原始图片
img2 = img.filter(ImageFIlter.BLUR) # 模糊处理
img2.save('test.png')
img3 = img.resize((90,169)) #尺寸处理
img3.save('test.png')

9. 元素等待

# 睡眠
time.sleep(5)# 等待APP加载完成(wait默认超时时间20s)
# d.wait_timeout = 30 //也可以设置默认超时间
# d.implicitly_wait(30) //也是设置默认时间
d.app_start("com.xxx.fave",wait=True)
# 等待页面加载完成
d.wait_activity()
# 等待无素出现
d().wait()
# 等待元素消失
d().wait_gone()
# 判元素是否存在
d().exist()
# 操作单独设置超时,一般不需要设置
d().click(timeout=50)
d().set_text(timeout=50)
d().clear_text(timeout=50)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL日志 ②⑩ MySQL日志:错误日志…

SpringBoot3.x最简集成SpringDoc-OpenApi

为什么使用SpringDoc 在SpringBoot低版本时一般使用Swagger扫描接口生成Json格式的在线文档,然后通过swagger-ui将Json格式的文档以页面形式展示文档。可惜遗憾的是swagger更新到3.0.0版本(springfox)后不更新了。 SpringBoot3.x以后需要的JDK版本最低为Java17&…

MQ和redis的内部原理一些总结

首先,先知道内部原理;其次,就是查官方文档实战了。 但是如果不熟悉内部原理,那么仅仅只是安装官方文档,并不能排除跟踪问题和故障、预防风险等策略; 以下总结图解:(mysql 8.0新增的…

YOLO目标检测——卫星遥感舰船检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:卫星遥感舰船检测数据集说明:卫星遥感舰船检测数据集,真实场景的高质量图片数据,数据场景丰富,含船一个类别标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xm…

Redis的持久化

redis是一个内存数据库,是把数据存储在内存中的,而我们知道内存中的数据是不持久的,一旦服务器重启或者进程重启,内存的数据就丢失了.为了让数据达到持久化的效果,就必须把数据写到硬盘上. redis相对于mysql这样的关系型数据库最明显的优势就是快.所以为了保证速度快,数据还得…

动态跳过测试用例

动态跳过测试用例 说明 我们可以通过指定环境变量来动态判断是否执行指定的测试用例设置环境变量有很多种方法,例如命令行方式,格式:--env keyval1,key2val2 ,若需要指定多个环境变量则需要逗号来隔开,而不是空格 t…

Live800:企业提升客户互动体验,有哪些关键因素?

如今,随着信息时代的不断发展,企业已经不再是单向的商业机构,他们需要与客户进行及时的沟通与反馈,从而更好地提升客户互动体验,达到营销和用户体验的双赢局面。那么,企业如何提升客户互动体验呢&#xff1…

设计模式——RBAC 模型详解

1.什么是 RBAC 呢? RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。 简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配…

Mysql 中如何导出数据?

文章目录 前言MySQL 导出数据使用 SELECT ... INTO OUTFILE 语句导出数据SELECT ... INTO OUTFILE 语句有以下属性:导出表作为原始数据导出SQL格式的数据将数据表及数据库拷贝至其他主机 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:…

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数? 1. argc、argv Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的? 通常应用程序都…

Raspberry Pi 5 新一代单板计算机:树莓派5代 (介绍、入门、解疑)

树莓派5代正式发布后,硬件和性能的全面升级让众多开发者们都想入手感受一波,外观上Raspberry Pi 5 与前代产品非常相似,不过,在保留信用卡大小的整体尺寸的同时,也更新了一些设计元素,以适应新芯片组的功能…

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进,考虑了样本点与预测点的位置,即方向和距离,具体见下图: 2 改进 IDW 公式: 从IDW算法可看出,插值点的估算值仅与插值样本距插值点的远近相关,并未…

贝叶斯AB测试

AB测试是用来评估变更效果的有效方法,但很多时候会运行大量AB测试,如果能够在测试中复用之前测试的结果,将有效提升AB测试的效率和有效性。原文: Bayesian AB Testing[1] 随机实验,又称AB测试,是行业中评估因果效应的既…

自定义类型:结构体

1.结构体类型的声明 1.1结构体的概念 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣: struct Stu {char name[20];//名字int age;//年…

【Mysql】[Err] 1293 - Incorrect table definition;

基本情况 SQL文件描述 /* Navicat MySQL Data TransferSource Server : cm4生产-200 Source Server Version : 50725 Source Host : 192.168.1.200:3306 Source Database : db_wmsTarget Server Type : MYSQL Target Server Version : 50725 File…

vxe编辑保存表格

业务需求: 1、需要点击编辑时,全部表格显示编辑框,点击保存,全部保存。 2、因为位置问题,产品经理把24小时分成了两行,开发就得分两个表格。列标题是写死的,文字偏移也是写死的,其他…

服务器主机安全的重要性及防护策略

在数字化时代,服务器主机安全是任何组织都必须高度重视的问题。无论是大型企业还是小型企业,无论是政府机构还是个人用户,都需要确保其服务器主机的安全,以防止数据泄露、网络攻击和系统瘫痪等严重后果。 一、服务器主机安全的重…

__int128类型movaps指令crash

结论 在使用__int128时,如果__int128类型的内存起始地址不是按16字节对齐的话,有些汇编指令会抛出SIGSEGV使程序crash。 malloc在64位系统中申请的内存地址,是按16字节对齐的,但一般使用时经常会申请一块内存自己切割使用&#…

Qt的一个无边界窗口公共类

头文件&#xff1a; #pragma once #include <QWidget>class CFrameLessWidgetBase :public QWidget { public:CFrameLessWidgetBase(QWidget* p nullptr);~CFrameLessWidgetBase() {}protected:bool nativeEvent(const QByteArray& eventType, void* message, long…

static和extern

1.extern extern 是⽤来声明外部符号的&#xff0c;如果⼀个全局的符号在A⽂件中定义的&#xff0c;在B⽂件中想使⽤&#xff0c;就可以使⽤ extern 进⾏声明&#xff0c;然后使⽤。 即在一个源文件中想要使用另一个源文件&#xff0c;即可通过这个extern来声明使用。 2.st…