appium如何连接多台设备
我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗时,因此需要考虑使用多线程来同时操作多台设备。
1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况,获取到设备名称。

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)
def driver(drivers): # 元素操作方法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()
同时,在这我准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取
软件测试视频教程观看处:
字节大佬教你逼自己如何在15天内掌握自动化测试(接口自动化/APP自动化/Web自动化/性能测试),内含项目实战
技术上的一点帮助
PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!
☑ 240集-零基础到精通全套视频课程
☑ [课件+源码]-完整配套的教程
☑ 18套-测试实战项目源码
☑ 37套-测试工具软件包
☑ 268道-真实面试题
☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。
相关文章:
appium如何连接多台设备
我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗时,因此需要考虑使用多线程来同时操作多台设备。 1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况&#…...
VUE el-form组件不绑定model时进行校验
在el-form中如果要使用:rules规则校验时,需要在el-form标签绑定 :model 如何不绑定model而进行校验字段: 思路: 1.假设规则为非空判断 2.获取该字段,进行非空判断,记录该字段是否校验完成,添加到校验标识中 3.表单或数据提交时,判断校验标识 required 红星星 :error 提示项 …...
计算机视觉的监督学习与无监督学习
什么是监督学习? 监督学习是一种机器学习算法,它从一组已标记的 合成数据生成器中生成的训练数据中学习。这意味着数据科学家已经用正确的标签(例如,“猫”或“狗”)标记了训练集中的每个数据点,以便算法可…...
Linux-lvds接口
lvds接口 单6 单8 双6 双8...
Android 自定义View一
1.继承已有VIew,改写尺寸:重写onMeasure SquareImageView 2.完全自定义重写onMeasure 3.自定义Layout 重写onMeasure onLayout 1.继承已有VIew,改写尺寸:重写onMeasure 流程: 重写onMeasure 用getmeasureedWidth …...
11、电路综合-集总参数电路结构的S参数模型计算与Matlab
11、电路综合-集总参数电路结构的S参数模型 电路综合专栏的大纲如下: 网络综合和简化实频理论学习概述 前面介绍了许多微带线电路综合的实际案例,如: 3、电路综合原理与实践—单双端口理想微带线(伪)手算S参数与时域…...
计算机网络--真题
因特网上专门用于传输文件的协议是 因特网上专门用于传输文件的协议通常是 FTP(File Transfer Protocol)。FTP 是一种标准的网络协议,用于在计算机之间传输文件。它允许用户在客户端和服务器之间传输文件,上传文件到服务器或从服务…...
java毕业设计基于ssm的招聘求职网站
项目介绍 本前途招聘求职网站是针对目前仓库的实际需求,从实际工作出发,对过去的前途招聘求职网站存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确…...
【JavaEE初阶】 初识网络原理
文章目录 🌲网络发展史🚩独立模式🚩网络互连📌局域网LAN🎈基于网线直连🎈基于集线器组建🎈基于交换机组建🎈基于交换机和路由器组建 📌广域网WAN 🍀网络通信基…...
LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释
原题链接: https://leetcode.cn/problems/cousins-in-binary-tree/ 解题思路: 使用队列进行BFS搜索,同时保存每个节点,以及其深度和父节点信息。当搜索到x和y时,对比深度和父节点,如果满足要求࿰…...
在python中加载tensorflow-probability模块和numpy模块
目录 操作步骤: 注意: 问题: 解决办法: 操作步骤: 在虚拟环境的文件夹中,找到Scripts文件夹,点击进去,找到地址栏,在地址栏中输入cmd,进入如下界面。 输…...
t2017递推2猴子摘桃
2、猴子摘桃(nhoi2005xx1) Description 果园里种了很多桃树,当桃树开始结果的时候,猴子便会成群结队地前来摘桃。 猴子们第一天会摘掉桃子的一半还多一个,第二天再摘第一天剩下的一半还多一个,以后每天均摘掉上一天剩下的一半还…...
呼吸灯【FPGA】
晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件:上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振, 49_999_999 是 1秒…...
Codeforces 1855E 数学期望 + DP
题意 传送门 Codeforces 1855E Expected Destruction 题解 将 S i S_i Si 运动至 S i 1 S_{i1} Si1 的情况看作后者消失,则 S i S_i Si 在碰到 S i 1 S_{i 1} Si1 前, S i 1 S_{i 1} Si1 必然存在。 根据数学期望的线性性质&…...
5-1CComplex运算符重载为友元
以下是一个用运算符重载为友元重载的方法重做复数加减法的运算,请填空完成程序。 #include <iostream> using namespace std; class CComplex { private:double real; double imag; public:CComplex(double r0.0,double i0.0){ real(r), imag(i)}friend…...
Vue3.0 watch和watchEffect监听器:VCA
简介 在项目中,有时候检测一个变量的值是否反升了变化。通常使用的watch或者使用低效的循环判断。 在次vue中给我们设置了深度监测数据繁盛变化的方法。 1.vue中提供了在watch监听时设置deep:true 就可以实现对对象的深度监听; 2.immediate:true,代表watch里面声明了…...
1360. 日期之间隔几天
1360. 日期之间隔几天 Java代码: 【DateFormat】DateFormat用于实现日期的格式化 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // 好像已过时class Solution {public int daysBet…...
ubuntu配置 Conda 更改默认环境路径
我的需求是以后凡是新建一个虚拟环境都需要安装在一个挂载了大容量的分区/data里面 /home里面的是即将爆满但是还能塞点东西的硬盘. 如果您想要永久更改 Conda 的默认环境路径,可以编辑 Conda 的配置文件。首先,找到 Conda 的配置文件通常是 .condarc 文…...
华山编程培训中心——工业相机飞拍
飞拍功能是一种高速运动图像采集技术,通过降低相机的曝光时间来拍摄快速移动的对象,以提高工作效率和加快生产速度。下面视频演示工业相机飞拍: 上位机控制工业相机飞拍演示 一. 飞拍对相机硬件的要求 全局快门相机:飞拍要求相机…...
linux 释放缓存命令并做成定时任务
这个命令组合可以实现将待写入的数据同步到磁盘中,然后释放页面缓存。具体命令为: sync; echo 1 > /proc/sys/vm/drop_caches 第一个命令 sync 是将所有待写入磁盘的数据刷新到磁盘中,确保数据写入完成。第二个命令 echo 1 > /proc/…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
