一,问题

app自动化测试使用Android真机连接电脑时,通常会遇到两种情况:

1、测试机连接电脑会弹窗提示USB选项,选择USB用于"传输文件",有些手机不支持设置默认USB选项,手机重新连接电脑时都需要手动点击选择USB选项;

2、使用adb命令在真机上安装app时,需要手动点击确认安装按钮。

二,思考

每天定时唤醒手机执行自动化测试时,偶尔会遇到真机重新弹窗提示进行USB用于选项的选择,需要选择USB用于传输文件,否则会执行失败。为了能让手机自动选择USB用于传输文件,我们考虑以下解决方法:

1,修改手机默认设置,不可行。在手机里设置USB默认选择USB用于"传输文件",但发现现在很多手机里面并没有这个设置选项,行不通。

2,通过appium定位元素解决,不可行。因为执行的顺序是先选择USB选项,再通过appium启动APP进行元素定位,所以此时使用appium的webdriver定位元素再点击"传输文件"显然也是行不通的。

3,通过poco自动化测试框架定位元素解决,可行。

使用豆瓣镜像源下载安装pocoui库,同时会下载airtest库。pip list命令查看,如果未同时安装airtest库,则再安装airtest库:

# 安装pocoui库
pip install pocoui -i https://pypi.douban.com/simple/
# 安装airtest库
pip install airtest -i https://pypi.douban.com/simple/

代码示例如下:

from poco.drivers.android.uiautomation import AndroidUiautomationPoco

poco = AndroidUiautomationPoco()
poco.device.wake()
# 存在传输文件元素则点击
if poco(text="传输文件").exists():
poco(text="传输文件").click()
else:
pass

调试运行脚本发现该方法是可行的,但是脚本会报其他错误,暂时还未解决。不推荐使用

4,通过Python调用adb命令定位元素解决(不依赖测试框架),可行(推荐使用)。

三,通过Python调用adb命令定位元素解决

1,思路:

adb命令获取手机当前页面的UI树xml文件 --> 将xml文件pull到本地 --> 通过元素属性值获取xml文件中对应的属性 --> python解析获取元素的bounds值并计算出该元素的中心坐标 --> 通过adb命令点击该坐标。

2,获取UI树文件命令:adb shell uiautomator dump +路径

只有一台手机:adb shell uiautomator dump /sdcard/uidump.xml

多台手机的话获取对应手机UI树文件命令:adb -s deviceId shell uiautomator dump --compressed /sdcard/uidump.xml

devicesId即设备id,通过adb devices命令获取

3,示例代码如下:

import tempfile
import os, re, time
import xml.etree.cElementTree as ET def topElementCoordinate(deviceId, attr_k, attr_v):
'''
通过adb命令获取手机当前页面的ui树-->pull到本地临时文件-->通过属性值从ui树文件中获取元素的bounds-->
获取元素左上角/右下角的坐标-->得到该元素的中心坐标-->点击
param deviceId: 手机设备ID
param attr_k: 元素属性,如text, resource-id, class等
param attr_v: 属性的值,如text='文件传输',属性值为'传输文件'
return:
'''
tempFile = tempfile.gettempdir() # 临时文件
try:
os.popen("adb -s" + " " + deviceId + " " + "shell uiautomator dump --compressed /sdcard/uidump.xml")
os.popen("adb -s" + " " + deviceId + " " + "pull /sdcard/uidump.xml " + tempFile)
tree = ET.ElementTree(file=tempFile + "/uidump.xml")
treeIter = tree.iter(tag="node")
for elem in treeIter:
if elem.attrib[attr_k] == attr_v:
bounds = elem.attrib['bounds']
coord = re.compile(r"\d+").findall(bounds)
x_point = (int(coord[2]) - int(coord[0])) / 2.0 + int(coord[0])
y_point = (int(coord[3]) - int(coord[1])) / 2.0 + int(coord[1])
print(x_point, y_point)
os.popen("adb -s" + " " + deviceId + " " + "shell input tap {} {}".format(str(x_point), str(y_point)))
# 删除手机中的xml文件
os.popen("adb -s" + " " + deviceId + " " + "shell rm /sdcard/uidump.xml")
time.sleep(1)
except Exception as e:
print("点击{}中心坐标失败,原因是:{}".format(attr_v, e)) if __name__ == '__main__':
topElementCoordinate('64c83202', 'text', '传输文件')

运行该文件调试,成功。

总结,不同的手机连接电脑时,会有不同的提示,此时我们就可以通过第4种方法执行选择点击操作,然后再运行自动化测试项目。

Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)的更多相关文章

  1. 用Python+Aria2写一个自动选择最优下载方式的E站爬虫

    前言 E站爬虫在网上已经有很多了,但多数都只能以图片为单位下载,且偶尔会遇到图片加载失败的情况:熟悉E站的朋友们应该知道,E站许多资源都是有提供BT种子的,而且通常打包的是比默认看图模式更高清的文件: ...

  2. 记录python接口自动化测试--把测试结果写进excel文件(第九目)

    python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取 ...

  3. Python 调用让系统自动调用默认程序打开文件?

    windows上可以使用os.startfile os.startfile(file) linux上可以使用xdg-open subprocess.call(["xdg-open" ...

  4. python接口自动化测试 - requests库的post请求进行文件上传

    前言 如果需要发送文件到服务器,比如上传图片.视频等,就需要发送二进制数据. 一般上传文件使用的都是 Content-Type: multipart/form-data; 数据类型,可以发送文件,也可 ...

  5. web自动化测试---web页面元素的定位

    selenium提供了很多用于定位元素的方法,首先我们自己需要知道元素有哪些属性,这就需要用到安装测试环境中firebug来定位 打开firefox浏览器,按下F12键,我们就可以看到如下图所示的界面 ...

  6. appium可通过SDK自带的uiautomatorviewer或monitor工具,来查看页面元素(Android)

    工具一:uiautomatorviewer 1.在SDK的tools目录中找到uiautomatorviewer,双击打开若出现闪退一般是jdk版本不匹配(建议安装jdk1.8的): 2.在使用这个工 ...

  7. Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)

    简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...

  8. Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

    简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...

  9. Appium自动化测试(1)-安装&环境

    需要链接appium自动化测试教程 http://www.cnblogs.com/fnng/p/4540731.htmlappium中文文档:https://github.com/appium/app ...

随机推荐

  1. List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇

    最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java ...

  2. Ubuntu 18.04 LTS 配置静态IPv6地址

    学校的IPv4地址限制了校内IP访问,在家连校内机器只能先连接学校的VPN,十分不方便.好在学校没有对IPv6地址做限制,因此我们可以给自己的机器配置一个静态IPv6地址来绕过这个限制. 本机系统使用 ...

  3. SpringMVC-乱码问题

    乱码问题 目录 乱码问题 1. 使用原生filter解决 1. 前端jsp 2. 编写controller 3. 编写过滤器 4. 注册过滤器 2. 使用SpringMVC提供的过滤器实现 1. 使用 ...

  4. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

  5. ansible使用,常用模块

    使用ansible管理其他主机有两种方式: 1.命令行执行ansible ad-hoc命令 2.把要做的动作行为写入一个文件[playbook脚本],ansible读取脚本自动完成相应的任务. Ans ...

  6. 看图学习 ArrayBuffers 和 SharedArrayBuffers

    原文地址:A cartoon intro to ArrayBuffers and SharedArrayBuffers 原文作者:Lin Clark 译者:黑黑 校对者:Bob 在上一篇文章中,老司机 ...

  7. NetCore微服务实战体系:日志管理

    一. 起始 进入NetCore时代,日志的使用有了很大的变化,因为跨平台以及虚拟化技术的使用,日志不能够再像Framework的方式直接记录在文本,文本其实也可以,但是日志的管理以及查看都不太方便.L ...

  8. python 小脚本/自动重复访问网站(快速提高网页访问量)

    来到csdn也快两个月了,前前后后写了20篇博客,但才1800+的访问量,其中恐怕还有300多是我自己点的 有点桑心(┬_┬) 于是打算另辟蹊径,自己刷访问量代码如下,需要自取 import urll ...

  9. pycharm+Django启动我的第一个页面(Django二)

    打开pycharm(社区版),File->open 找到由命令 django-admin startproject mysite 在D盘下创建的文件夹mysite mysite通过文件资源管理器 ...

  10. 初等函数——幂函数(Power Function)

    幂函数(Power function)是形如f(x)=xa的函数,a∈R是实数.即以底数为自变量,幂为因变量,指数为常数的函数称为幂函数. 性质 幂函数的图像一定会出现在第一象限内,一定不会出现在第四 ...