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

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)


一,问题


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


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


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

微信图片_20220424150535.png

二,思考


每天定时唤醒手机执行自动化测试时,偶尔会遇到真机重新弹窗提示进行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种方法执行选择点击操作,然后再运行自动化测试项目。

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
3月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
348 1
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
259 0
|
3月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
109 4
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
255 18
|
10月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
356 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
安全 测试技术 API
Python 单元测试详解
单元测试是Python开发中不可或缺的环节,能确保代码按预期运行、发现Bug、提升代码质量并支持安全重构。本文从基础概念讲起,逐步介绍Python单元测试的实践方法,涵盖unittest框架、pytest框架、断言使用、Mock技巧及测试覆盖率分析,助你全面掌握单元测试技能。
244 0
|
5月前
|
IDE 测试技术 API
python调试与测试
python调试与测试
|
5月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
6月前
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
164 10
|
6月前
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
278 0

推荐镜像

更多