Appium 并行测试多个设备

一、前置说明

在自动化测试中,经常需要验证多台设备的兼容性,Appium可以用同一套测试运例并行测试多个设备,以达到验证兼容性的目的。
解决思路:

  1. 查找已连接的所有设备;
  2. 为每台设备启动相应的Appium Server;
  3. 使用多线程执行 pytest 命令;

二、核心代码

# test_multi_devices.py

import pytest

from driver.appium.manager import port_manager


@pytest.fixture(scope="session")
def devicename(request):
    return request.config.getoption("--devicename")


@pytest.fixture
def driver(devicename):
    from driver.appium.driver import WebDriver
    
    server_port = port_manager.get_server_port(devicename)
    trans_port = port_manager.get_trans_port(devicename)

    # appium 多设备并行注意事项:
    # 1. server_port: 必须传值,它是 appium server 的监听端口号,在启动多个 appium server的情况下,用于指定当前driver与哪个 server 进行通信;
    # 2. uuid: 必须传值,它是每个设备的唯一标识,用于appium server区分与哪台设备在通信,确保测试执行不会混淆;
    # 3. systemPort: 必须传值,是UiAutomator2 Server的6790端口绑定至本地的端口号,该端口用于在本地监听并接收从 UiAutomator2 Server 发出的请求;

    appium_server_url = f'http://localhost:{server_port}'
    capabilities = {
        "platformName": "Android",
        "automationName": "uiautomator2",
        "deviceName": devicename,
        "udid": devicename,
        "app": "D:\\resources\\ApiDemos-debug.apk",
        "systemPort": trans_port
    }

    driver = WebDriver(command_executor=appium_server_url, capabilities=capabilities)

    yield driver

    driver.quit()


def test_runner(driver):
    driver.smart_find_element(by='text', value='App').click()
    driver.smart_find_element(by='text', value='Notification').click()
    driver.smart_find_element(by='text', value='NotifyWithText').click()
    driver.smart_find_element(by='text', value='SHOW SHORT NOTIFICATION').click()

    element = driver.get_toast('Short notification')
    assert element.text == 'Short notification'

# main.py

import threading
import pytest
from driver.appium.manager import MobileDevicesManager, AppiumServersManager, device_manager

from driver.appium.manager import port_manager

PY_RUNNER = 'tests/test_multi_devices.py'


def start_server_and_run_pytest(devicename):
    """
    启动Appium Server,并且执行pytest
    """
    port = port_manager.get_server_port(devicename)

    # 为每台设备启动一个appium server
    server_manager = AppiumServersManager(port)
    server_manager.start_server()

    # 执行pytest
    pytest.main([PY_RUNNER, '-s', '-v', '--devicename', devicename])


def run_multi_devices():
    """
    多设备并行测试
    """
    devices = device_manager.get_connected_devices()

    threads = []
    for devicename in devices:
        thread = threading.Thread(target=start_server_and_run_pytest, args=(devicename,))
        threads.append(thread)

        # 启动线程
        thread.start()

    # 等待所有线程完成
    for thread in threads:
        thread.join()


if __name__ == '__main__':
    import logging.config

    logging.config.fileConfig('conf/logging.conf')

    # 执行并发测试
    run_multi_devices()

三、Demo验证

当前有3台设备连接,执行代码,会启动3个appium server:

3台设备会同时执行测试(有1台为手机,不方便截图):

四、appium 多设备并行注意事项


    # 1. server_port: 必须传值,它是 appium server 的监听端口号,在启动多个 appium server的情况下,用于指定当前driver与哪个 server 进行通信;
    # 2. uuid: 必须传值,它是每个设备的唯一标识,用于appium server区分与哪台设备在通信,确保测试执行不会混淆;
    # 3. systemPort: 必须传值,是UiAutomator2 Server的6790端口绑定至本地的端口号,该端口用于在本地监听并接收从 UiAutomator2 Server 发出的请求;

	appium_server_url = f'http://localhost:{server_port}'
    capabilities = {
        "platformName": "Android",
        "automationName": "uiautomator2",
        "deviceName": devicename,
        "udid": devicename,
        "app": "D:\\resources\\ApiDemos-debug.apk",
        "systemPort": trans_port
    }
    driver = WebDriver(command_executor=appium_server_url, capabilities=capabilities)

欢迎技术交流:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/227141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【头歌系统数据库实验】实验7 SQL的复杂多表查询-1

目录 第1关:求各颜色零件的平均重量 第2关:求北京和天津供应商的总个数 第3关:求各供应商供应的零件总数 第4关:求各供应商供应给各工程的零件总数 第5关:求重量大于所有零件平均重量的零件名称 第6关&#xff1…

字节开源的netPoll底层LinkBuffer设计与实现

字节开源的netPoll底层LinkBuffer设计与实现 为什么需要LinkBuffer介绍设计思路数据结构LinkBufferNodeAPI LinkBuffer读 API写 APIbook / bookAck api 小结 本文基于字节开源的NetPoll版本进行讲解,对应官方文档链接为: Netpoll对应官方文档链接 netPoll底层有一个…

IntelliJ IDEA开启git版本控制的简单教程

这篇文章想要分享一下怎么在IntelliJ IDEA开启版本控制,博主使用的是gitee,首先需要安装git,关于git的安装这里就不介绍了,很简单。 目录 创建git仓库 创建项目 开启版本控制 拉取项目 创建git仓库 首先,需要登录…

python 使用 AppiumService 类启动appium server

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。 二、操作步骤 import osfrom appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import pathclass AppiumSer…

office办公技能|ppt插件使用

PPT插件获取:链接:https://pan.baidu.com/s/1BOmPioUKeY2TdC-1V-o3Vw 提取码:tdji 一、ppt插件介绍 PPT插件是一种可以帮助用户在Microsoft PowerPoint软件中添加各种额外功能和效果的应用程序。使用PPT插件可以让用户更加轻松地制作出专业、…

No Chromedriver found that can automate Chrome ‘x.x.xxxx‘的解决办法

一、前置说明 在使用Appium对Android设备自动化测试时,切换WebView时抛出异常: selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver foun…

12-07 周四 Pytorch 使用Visdom 进行可视化

简介 在完成了龙良曲的Pytroch视频课程之后,楼主对于pytroch有了进一步的理解,比如,比之前更加深刻的了解了BP神经网络的反向传播算法,梯度、损失、优化器这些名词更加熟悉。这个博客简要介绍一下在使用Pytorch进行数据可视化的一…

JAVA导出PDF(一)

思路一:直接导出pdf 使用freemarker和itext把html转pdf,存在中文乱码,宋体不识别,需下载simsun.ttc字体,空白占位符不识别等等问题,对前端依赖性较大,不推荐; 适用范围:…

使用Python实现爬虫IP负载均衡和高可用集群

做大型爬虫项目经常遇到请求频率过高的问题,这里需要说的是使用爬虫IP可以提高抓取效率,那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群,并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一…

solidity实现ERC1155多代币标准

文章目录 1、NFT - 维基百科2、IERC1155MetadataURI3、IERC1155Receiver4、IERC11555、ERC11556、NFT11557、开源地址 1、NFT - 维基百科 ERC-1155 标准于2018年6月由Witek Radomski、Andrew Cooke、Philippe Castonguay、James Therien、Eric Binet及Ronan Sandford提出。此标…

『 C++ 』BinarySearchTree搜索二叉树

文章目录 前言 🦕二叉搜索树的概念 🦕搜索二叉树的初始化 🦕Insert( )插入函数 🦕👾 InsertR( ) 插入函数(递归) InOrder( ) 中序遍历打印 🦕Find( ) 查找函数 🦕👾 Find( ) 查找函数…

【Ajax】发送get请求获取接口数据

编写html实现通过Ajax发送get请求并获取数据 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

Libsvm中grid.py文件的解读

1.导入相关文件 这里重点讲一下 _ _all_ _ [find_parameters] &#xff1a; _all__ [find_parameters] 是 Python 中用于定义模块级别的变量 __all__ 的语法&#xff0c; __all__ 是一个包含模块中应该被公开&#xff08;即可以通过 from module import * 导入&#xff09;的…

【开源】基于Vue+SpringBoot的快乐贩卖馆管理系统

项目编号&#xff1a; S 064 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S064&#xff0c;文末获取源码。} 项目编号&#xff1a;S064&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视…

CentOS上安装和配置Apache HTTP服务器

在CentOS系统上安装和配置Apache HTTP服务器可以为您的网站提供可靠的托管环境。Apache是开源的Web服务器软件&#xff0c;具有广泛的支持和强大的功能。下面是在CentOS上安装和配置Apache HTTP服务器的步骤&#xff1a; 步骤一&#xff1a;安装Apache HTTP服务器 打开终端&am…

总结一篇本地idea配合阿里云服务器使用docker

idea打包打镜像发到阿里云服务器 先说一下使用docker desktop软件怎么使用 1.下载docker desktop官网&#xff0c;先注册个账号吧&#xff0c;后面桌面软件登录会用到&#xff08;当然&#xff0c;配合这个软件使用需要科学上网&#xff09; 安装这个要配合wsl使用&#xf…

电脑搜不自己的手机热点,其余热点均可!

一、现象&#xff1a; 之前可正常连接&#xff0c;突然间发现收不到自己的WiFi信号&#xff0c;其余人均可收到。通过重复手机电脑关机、改变热点设置中的频段等方式均没解决&#xff0c;同事电脑和手机可搜索到我的WiFi。 二、问题&#xff1a; WiF驱动程序更新 三&#x…

ingress介绍和ingress通过LoadBalancer暴露服务配置

目录 一.ingress基本原理介绍 1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡 2.controller和ingress 3.通过下面这个图可能会有更直观的理解 二.为什么会出现ingress 1.NodePort存在缺点 2.LoadBalancer存在缺点 三.ingress三种暴露服务的…

『TypeScript』从零开始编写你的第一个TypeScript程序

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript及为什么使用TypeScriptTypeScript的安装过程编写第一个HelloTs程序 文章目录 一、TypeScript简介1. 什么是TypeScript&#xff1f;2. 为什么选择使用TypeScript&#xff1f;2.1 静态类型检查2.2 更好的代码维护性2.3 更…

Prometheus 配置文件和标签 Pmsql

1.Prometheus配置文件 Prometheus可以通过命令行或者配置文件的方式对服务进行配置。 命令行方式一般用于不可变的系统参数配置&#xff0c;例如存储位置、要保留在磁盘和内存中的数据量等&#xff1b;配置文件用于定义与数据动态获取相关的配置选项和文件等内容。命令行方式…