news 2026/5/30 13:27:49

appium如何连接多台设备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
appium如何连接多台设备

我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗
时,因此需要考虑使用多线程来同时操作多台设备。

1.我们拿两台设备来模拟操作下,使用:adbdevices查看连接状况,获取到设备名称。

2.获取需要操作app的包名和页面名称(前提该设备已经打开了app)

3.设置初始配置信息

from appium import webdriver import threading # 设备一 def run_01(): desired = { "platformName": "Android", # 手机系统 "platformVersion": "7.1.2", # 手机系统版本 "deviceName": '127.0.0.1:62001', # 连接的设备(adb devices) "automationName": "UiAutomator2", "appPackage": "", # app包名 "appActivity": "", # app的启动页面 "autoGrantPermissions": "true", # 默认允许app获取相关权限 "noReset": True # 保留登录模式 } driver_01 = webdriver.Remote(command_executor="http://127.0.0.1:4723/wd/hub", desired_capabilities=desired) # driver(driver_01) # 设备二 def run_02(): desired = { "platformName": "Android", # 手机系统 "platformVersion": "11", # 手机系统版本 "deviceName": '90bf8faf', # 连接的设备(adb devices) "automationName": "UiAutomator2", # 自动化测试框架 (1.4以上的appium不用写) "appPackage": "", # app包名 "appActivity": "", # app的启动页面 "autoGrantPermissions": "true", # 默认允许app获取相关权限 "noReset": True # 保留登录模式 } driver_02 = webdriver.Remote(command_executor="http://127.0.0.1:4720/wd/hub", desired_capabilities=desired) # driver(driver_02)

不同的设备启动配置端口号是不一样的,我这里一个是4723,一个是4720.

4.打开页面后操作元素,这里只简单的关闭页面(具体方法可参考:

https://www.cnblogs.com/lihongtaoya/p/16988855.html)

time.sleep(5) drivers.quit()

5.使用多线程运行多台设备

if __name__ == '__main__': threading.Thread(target=run_01).start() threading.Thread(target=run_02).start()

6.启动appium服务

启动指令:appium --allow-cors -p 端口号 -U 设备名称

我这边是两台设备,因此需要启动两个服务,启动完之后就可以运行main函数了。

7.以上实例是将配置信息写在了代码中,若是有十几二十几台设备的话,这种写法有点麻烦,我们可以将配置信息的产生封装在json文件中使用时用load()方法去取参数即可。

1)创建一个json文件存放配置信息

[{ "url": "http://127.0.0.1:4723/wd/hub", "desired": { "platformName": "Android", "platformVersion": "7.1.2", "deviceName": "127.0.0.1:62001", "automationName": "UiAutomator2", "appPackage": "", "appActivity": "", "autoGrantPermissions": "true", "noReset": true} }, { "url": "http://127.0.0.1:4720/wd/hub", "desired":{ "platformName": "Android", "platformVersion": "11", "deviceName": "90bf8faf", "automationName": "UiAutomator2", "appPackage": "", "appActivity": "", "autoGrantPermissions": "true", "noReset": true} }]

2)读取配置信息,这里直接贴完整代码了。

def test_run(url, desired): driver_02 = webdriver.Remote(command_executor=url, desired_capabilities=desired) driver(driver_02) def driver(drivers): # 元素操作方法 time.sleep(5) drivers.quit() if __name__ == '__main__': with open("./appium.json", mode="r", encoding="utf-8") as f: data = list(json.load(f)) for i in range(0, len(data)): a = threading.Thread(target=test_run, args=(data[i]["url"], data[i]["desired"])) a.start()

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 19:02:23

别再迷信大模型了!微软全新RL方法,让14B小模型“越级”挑战DeepSeek-R1,大海捞针轻松拿捏!

在当前大语言模型的发展中,长上下文推理能力的提升已成为关键研究方向。然而,构建具备高级长上下文推理能力的模型仍面临多重挑战。 首先,用于训练的理想问题需足够复杂以激发深度推理并支持从长上下文中动态检索关键信息,而且答…

作者头像 李华
网站建设 2026/5/25 1:36:44

1、探索 DB2 Express - C:免费且强大的数据库解决方案

探索 DB2 Express - C:免费且强大的数据库解决方案 1. 适用人群与书籍结构 对于数据库管理员(DBAs)、应用程序开发人员、顾问、软件架构师、产品经理、教师和学生等与数据库打交道或打算从事相关工作的人来说,有一个很好的资源可以帮助他们了解和使用数据库。这个资源不仅…

作者头像 李华
网站建设 2026/5/25 15:18:20

11、DB2 数据库安全与备份恢复全解析

DB2 数据库安全与备份恢复全解析 1. DB2 数据库安全基础 在 DB2 数据库系统中,有两个重要的用户组与安全访问密切相关: - DB2ADMNS :该组和本地管理员通过操作系统对所有 DB2 对象拥有完全访问权限。 - DB2USERS :此组通过操作系统对所有 DB2 对象具有读取和执行访…

作者头像 李华
网站建设 2026/5/27 4:49:29

全国知名省级网络安全大赛

以下是全国范围内主要和知名的省级及国家级网络安全大赛的梳理,你可以根据自身情况选择参加。一、 国家级综合赛事(通常下设省赛区)这些大赛影响力最大,覆盖面最广,通常先举办省赛选拔,优胜者进入全国总决赛…

作者头像 李华
网站建设 2026/5/30 6:56:16

计算机网络复习全书(详细整理)

[TOC](计算机网络复习全书目录)前言:为什么你需要这份指南?计算机网络是IT世界的基石,也是每一位计算机、软件工程及相关专业学生必须掌握的核心课程。面对教材的厚重、概念的繁多和计算题的烧脑,期末复习往往令人望而却步。这份《…

作者头像 李华
网站建设 2026/5/30 7:31:49

4、GTK+ 容器小部件全解析

GTK+ 容器小部件全解析 在 GTK+ 开发中,容器小部件是构建用户界面的重要组成部分,它们可以帮助我们组织和排列其他小部件。容器小部件主要分为装饰器容器和布局容器两类。 容器小部件概述 容器类的主要目的是让一个父小部件包含一个或多个子小部件。GTK+ 中有两种类型的容…

作者头像 李华