uiautomator2学习3——uiautomator2的Device

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

uiautomator2学习3——uiautomator2的Device

Device介绍

上一篇讲到了 d 是 Device 的实例,这里就讲讲Device。
Device 其实就是模拟设备的一系列的操作,比如:安装apk包、打开/关闭app、点击、输入等等。
下面讲一下 Device 的方法。

Device方法

  • 安装apk文件
# 源码
app_install(data)
# 参数:
# 	data:可以是文件完整路径、url、文件对象其中一种,必传参数。(这里的路径是指你本机的文件完整路径)
# 如果文件不存在,会抛出 RuntimeError 异常。

# 示例:
d.app_install(r"C:\Users\admin\Desktop\104251.apk")
  • 启动app
# 源码
app_start(package_name: str, activity: Optional[str] = None, wait: bool = False, stop: bool = False, use_monkey: bool = False)
# 参数:
# 	package_name:app的package名,必填参数;
# 	activity:app的activity名,选填参数,默认为None;
# 	wait:是否等待知道app启动,选填参数,默认为False;
# 	stop:是否在启动app前先关闭app,选填参数,默认为False;
# 	user_monkey:当acitvity没有值时是否通过monkey命令来启动app,可传参数,默认为False。

# 示例:
d.app_start("com.taobao.taobao", stop=True)

关于 app 的 package 的值怎么来的?这边说下怎么获取这个值,在此之前需要准备两个东西,一个是aapt.exe,另一个是这个app 的apk包(又或者叫apk文件)。
在讲Weditor工具那一篇的时候有提到 android-sdk-windows,aapt.exe 就在 android-sdk-windows\build-tools\29.0.3 的目录下(注:路径上的29.0.3是版本号,不需要一致)。在dos窗口输入“aapt d badging 【apk文件的完整路径】”(注意一下dos的当前路径,当前路径要在adb.exe的目录下,如果已经将adb.exe的目录配置到环境变量可忽略。),如果你不想写很长的文件路径,可以把apk包放到与 aapt.exe 的所作的目录下。
在这里插入图片描述
如果你需要保留这些信息,可以修改下命令“aapt d badging 【apk文件完整路径】 > test.txt”,示例:

aapt d badging 701483.apk > test.txt

执行完命令后,同目录下会生成 test.txt 文件,这些信息都存放在里面了。

  • 停止运行的app
# 源码
app_stop(package_name)
# 参数:
# 	package_name:app的package名,必填参数。

# 示例:
d.app_stop("com.taobao.taobao")
  • 停止app并清空app数据
# 源码
app_clear(package_name: str)
# 参数:
# 	package_name:app的package名,必填参数。

# 示例:
d.app_clear("com.taobao.taobao")
  • 停止所有第三方应用
    停止除excludes里指定的和uiautomator相关app外的所有第三方应用。
# 源码
app_stop_all(excludes=[])
# 参数:
# 	excludes:list类型,指定不想被停止的app相应的package名,选填参数,如为空则仅保留uiautomator相关app。

示例:
d.app_stop_all("com.taobao.taobao")
  • 将文件导入到设备中
# 源码
push(src, dst: str, mode=0o644, show_progress=False)
# 参数:
# 	src:源文件路径或者文件对象,也就是电脑文件的路径,必填参数;
# 	dst:目标文件路径,也就是设备存放文件的路径,必填参数。
# 返回:
# 	dict对象,如:{"mode": "0660", "size": 63, "target": "/sdcard/ABOUT.rst"}
# 如 push 方法执行出错,会抛出 IOError 异常

示例:
d.push("foo.txt", "/sdcard/bar.txt")
  • 开启 / 关闭屏幕
# 源码
screen_on()		# 开启屏幕
screen_off()	# 关闭屏幕
# 无需传参

# 示例:
d.screen_on()
d.screen_off()
  • 通过键名或键代码模拟点击按键
# 源码
press(key: Union[int, str], meta=None)
# 参数:
#	key:键名,包括home, back, left, right, up, down, center, menu, search, enter,
            delete(或 del), recent(recent apps), volume_up, volume_down,
            volume_mute, camera, power。必填参数。

# 示例:
d.press("enter") # 模拟点击按键“enter”
  • 输入内容
# 源码
send_keys(text: str, clear: bool = False)
# 参数:
#	text:需要输入的文本内容,必填参数;
#	clear:输入前是否清空文本框,选填参数,默认为False。

# 示例:
d.send_keys("123456", clear=True)
  • 模拟输入法编辑器的代码
# 源码
send_action(code)
# 参数:
#	code:需要触发的代码编号或操作,必填参数。具体内容如下:
#		"go": 2"search": 3"send": 4"next": 5"done": 6"previous": 7。

# 示例:
d.send_action("search"),
d.send_action(3)

send_action 与 press 是不一样,前者是模拟输入法编辑器的内容,后者是模拟手机按键

  • 清空输入框内容
# 源码
clear_text()
# 无需传参

# 示例:
d.clear_text()
  • 按坐标单击
# 源码
click(x: Union[float, int], y: Union[float, int])
# 参数:
#	x:当值为小于1的小数时,则为屏幕的百分比坐标;否则为屏幕的像数坐标。必填参数。
#	y:当值为小于1的小数时,则为屏幕的百分比坐标;否则为屏幕的像数坐标。必填参数。

# 示例:
d.click(0.5, 0.5)
  • 按坐标双击
# 源码
double_click(x, y, duration=0.1)
# 参数:
#	x:当值为小于1的小数时,则为屏幕的百分比坐标;否则为屏幕的像数坐标。必填参数。
#	y:当值为小于1的小数时,则为屏幕的百分比坐标;否则为屏幕的像数坐标。必填参数。
#	duration:为两次点击的时间间隔,单位:秒。选填参数,默认为 0.1。

# 示例:
d.double_click(0.5, 0.5)
  • 按坐标长按
# 源码
long_click(x, y, duration: float = .5)
# 参数:
#	x:当值为小于1的小数时,则为屏幕的百分比坐标。否则为屏幕的像数坐标。必填参数。
#	y:当值为小于1的小数时,则为屏幕的百分比坐标。否则为屏幕的像数坐标。必填参数。
#	duration:为长按的持续时长,单位:秒。选填参数,默认为 0.1。

# 示例:
d.long_click(0.5, 0.5)
  • 滑动 (坐标形式)
# 源码
swipe(fx, fy, tx, ty, duration: Optional[float] = None, steps: Optional[int] = None)
# 参数:
#	fx:源x坐标,必填参数。
#	fy:源y坐标,必填参数。
#	tx:目标x坐标,必填参数。
#	ty:目标y坐标,必填参数。
#	duration:为长按的持续时长,单位:秒,不建议与steps同时设置,选填参数,默认为None。
#	steps:每一个steps就是5ms,不建议与duration同时设置,选填参数,默认为None。

# 示例:
d.swipe(50, 50, 50, 100, 0.5)  # 滑动0.5
  • 滑动 (方向的形式)
# 源码
swipe_ext(direction: Union[Direction, str], scale: float = 0.9, box: Union[None, tuple] = 	None,**kwargs)
# 参数:
#	direction:可填写"left", "right", "up", "bottom"或为Direction.LEFTD
			  irection.Right、Direction.UP、Direction.DOWN,必填参数;
#	scale:按百分比滑动,范围在(0, 1.0],选填参数,默认为0.9;
#	box:可为空或者为 [lx, ly, rx, ry]的形式,选填参数,默认为None;
#	kwargs: 作为参数用于d.swipe

示例:
d.swipe_ext("up", 0.6)  #向上滑动60%
  • 拖动
# 源码
drag(sx, sy, ex, ey, duration=0.5)
# 参数:
#	sx:源x轴坐标,必填参数;
#	sy:源y轴坐标,必填参数;
#	ex:目标x轴坐标,必填参数;
#	ey:目标y轴坐标,必填参数;
#	duration: 持续时长,单位秒,选填参数,默认为0.5.

示例:
d.drag(50, 50, 50, 100, 0.5)  
  • 截图
# 源码
screenshot(filename: Optional[str] = None, format="pillow")
# 参数:
#	filename:保存的文件名;
#	format:当filename为空时使用,在["pillow", "opencv", "raw"]取值其中一个。
# 当 screenshot 出错时,会出现 IOError, SyntaxError, ValueError 异常

# 示例:
d.screenshot("saved.jpg")
d.screenshot().save("saved.png")
cv2.imwrite('saved.jpg', screenshot(format='opencv'))
  • 下拉打开通知栏
# 源码
open_notification()
# 无需传参

# 示例:
d.open_notification()
  • 下拉打开快速设置栏
# 源码
open_quick_settings()
# 无需传参

# 示例:
d.open_quick_settings()
  • 检查特定的UI对象是否存在
# 源码
exists(**kwargs)
# 参数:
# 	**kwargs:元素的属性
# 返回:Bool类型

# 示例:
d.exists(text="Settings")
  • 旋转冻结
# 源码
freeze_rotation(freezed: bool = True)
# 参数:
#	freezed:是否冻结


#示例:
d.freeze_rotation()  # 关闭屏幕旋转
d.freeze_rotation(False)  # 开启屏幕旋转
  • 旋转冻结
# 源码
freeze_rotation(freezed: bool = True)
# 参数:
#	freezed:是否冻结


#示例:
d.freeze_rotation()  # 关闭屏幕旋转
d.freeze_rotation(False)  # 开启屏幕旋转

细心的同学可能会发现,Device 有关点击、双击、长按、滑动的方法基本都是要用到坐标才行,但我们实际上要做UI自动化测试的话,如果设备分辨率不一样,那么元素坐标是会有变化的,这样写出来的脚本就不能很好的兼容了,这时候我们就要用到 UiObject 了。
后续再继续介绍UiObject。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uiautomator2是一款用于Android设备自动化测试的工具,支持Python、Java和Golang语言,可以用于UI自动化测试、性能测试、Monkey测试等场景。下面是使用uiautomator2的简单说明: 1. 安装uiautomator2 可以通过pip安装uiautomator2: ``` pip install uiautomator2 ``` 或者从GitHub上下载源码安装: ``` git clone https://github.com/openatx/uiautomator2.git cd uiautomator2 python setup.py install ``` 2. 连接设备 在使用uiautomator2之前,需要先连接Android设备,可以通过USB连接或者WiFi连接。如果是通过USB连接,需要先打开USB调试模式。如果是WiFi连接,需要先在设备上安装ATX-Agent应用,并打开ATX-Agent应用的WiFi调试功能。 连接设备的代码如下: ```python import uiautomator2 as u2 # USB连接 device = u2.connect() # WiFi连接 device = u2.connect_wifi('设备IP地址') ``` 3. 查找元素 可以通过uiautomator2提供的方法查找元素,例如: ```python # 通过text属性查找元素 element = device(text='文本内容') # 通过resource-id属性查找元素 element = device(resourceId='元素ID') # 通过XPath表达式查找元素 element = device.xpath('//元素的XPath表达式') ``` 4. 操作元素 可以通过uiautomator2提供的方法操作元素,例如: ```python # 点击元素 element.click() # 输入文本 element.set_text('要输入的文本') # 获取元素的文本 text = element.get_text() ``` 5. 截图 可以通过uiautomator2提供的方法截取设备屏幕的截图,例如: ```python # 截取整个屏幕的截图 screenshot = device.screenshot() # 截取指定区域的截图 screenshot = device.screenshot(region=(x1, y1, x2, y2)) ``` 6. 其他功能 uiautomator2还提供了其他一些功能,例如: - 模拟按键事件 - 获取设备信息 - 执行Shell命令 - 启动应用 - 安装和卸载应用 具体使用方法可以参考官方文档:https://github.com/openatx/uiautomator2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值