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

简介: 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推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
8月前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
1920 2
|
7月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
1301 68
|
8月前
|
异构计算 Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
628 1
|
8月前
|
人工智能 Shell Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
328 0
|
9月前
|
数据处理 开发工具 开发者
requirement.txt 管理python包依赖
在 Python 项目中,`requirements.txt` 用于记录依赖库及其版本,便于环境复现。本文介绍了多种生成该文件的方法:基础方法使用 `pip freeze`,进阶方法使用 `pipreqs`,专业方法使用 `poetry` 或 `pipenv`,以及手动维护方式。每种方法适用不同场景,涵盖从简单导出到复杂依赖管理,并提供常见问题的解决方案,帮助开发者高效生成精准的依赖列表,确保项目环境一致性。
2712 4
|
9月前
|
缓存 数据可视化 Linux
Python文件/目录比较实战:排除特定类型的实用技巧
本文通过四个实战案例,详解如何使用Python比较目录差异并灵活排除特定文件,涵盖基础比较、大文件处理、跨平台适配与可视化报告生成,助力开发者高效完成目录同步与数据校验任务。
301 0
|
10月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
2533 0
|
测试技术 API Python
Appium控件交互策略:优化自动化测试效率的关键方法
该文介绍了如何使用Selenium与APP进行交互,包括点击、输入和状态判断等操作。例如,通过element.click()点击控件,element.send_keys()输入文本,以及element.is_displayed()检查元素是否可见。还展示了如何获取元素属性,如resource-id、text和class,并提供了Python代码示例来定位并操作APP元素,如滑动条的显示、可点击性检测及点击滑动条中心位置。在编写测试脚本时,应注意元素定位和状态验证以确保测试稳定性。
|
Web App开发 小程序 Android开发
Appium微信小程序自动化环境准备
Appium微信小程序自动化环境准备
928 1
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
1296 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路

推荐镜像

更多