python+appium自动化测试-appium并发测试之多设备启动(代码片段)

酔清风 酔清风     2023-03-09     249

关键词:

一、启动 appium 服务器(文末有福利哦)

1.通过命令行窗口启动单个 appium 服务器

appium  --  直接打开默认的4723端口号
appium -p 4723  --  使用-p来启动固定端口号的appium服务器

2.通过命令行窗口启动多个 appium 服务器

appium -p 4723
appium -p 4726

二、启动多个设备

1.在 yaml 文件配置 Capability 参数

desired_caps.yaml

platformName: Android
platformVersion: '9'
deviceName: U4AIUKFAL7W4MJLR
appPackage: com.sina.weibo
appActivity: com.sina.weibo.SplashActivity
automationName: UiAutomator2
autoGrantPermissions: True
noReset: True
url: 127.0.0.1

注意:

  • 手机系统版本号属于字符串格式,需要加''引号
  • url 为 appium 服务器的地址
  • 启动多个设备需要启动多个 appium 服务,所以这边不设置端口号

2.代码实现

from time import ctime
import yaml
from appium import webdriver

devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
with open(r"E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\config\\\\desired_caps.yaml", 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

def multi_app_start(udid, port):
    desired_caps = 'platformName': data['platformName'],
                    'platformVersion': data['platformVersion'],
                    'deviceName': data['deviceName'],
                    'udid': udid,
                    'appPackage': data['appPackage'],
                    'appActivity': data['appActivity'],
                    'automationName': data['automationName'],
                    'autoGrantPermissions': data['autoGrantPermissions'],
                    'noReset': data['noReset']
                    
    print('appium port:%s start run %s at %s' % (port, udid, ctime()))

    driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
    driver.implicitly_wait(10)
    return driver

# 测试函数,在实际运行过程中可以注释
if __name__ == '__main__':
    multi_app_start(devices_list[0], 4723)
    multi_app_start(devices_list[1], 4725)

注意:

  • 需要开启两个 appium 服务,且端口号不能一样
  • 连接的设备主要根据 udid 连接,而不是根据 yaml 文件中的 deviceName,所以在 yaml 文件中的 deviceName 可以随意设置
  • ctime() 表示当前时间
  • 以上为成功启动一个后才会启动另外一个,不是同步启动两个设备

最后运行结果为:

对以上代码封装成类:

class MultiDevices:
    driver: webdriver = None
    devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']

    def appium_desire(self, udid, port):
        with open(r"E:\\study\\Fork\\WeiboDemo\\Weibo\\config\\desired_caps.yaml", 'r') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)

        desired_caps = 'platformName': data['platformName'],
                        'platformVersion': data['platformVersion'],
                        'deviceName': data['deviceName'],
                        'udid': udid,
                        'appPackage': data['appPackage'],
                        'appActivity': data['appActivity'],
                        'automationName': data['automationName'],
                        'autoGrantPermissions': data['autoGrantPermissions'],
                        'noReset': data['noReset']
                        
        print('appium port:%s start run %s at %s' % (port, udid, ctime()))

        self.driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
        self.driver.implicitly_wait(10)
        return self.driver

# 测试函数,在实际运行中可以注释
if __name__ == '__main__':
    mas1 = MultiDevices()
    mas2 = MultiDevices()
    mas1.appium_desire(MultiDevices.devices_list[0], 4723)
    mas2.appium_desire(MultiDevices.devices_list[1], 4725)

三、多进程并发启动设备

  • 多进程中,同一个变量,各自有拷贝一份存在于每个进程中,互不影响
  • 多线程中,所有变量都由所有线程共享,任意一个比那辆都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,容易把内容改乱了

所以我使用的是多进程并发启动设备

yaml 文件同上,代码实现如下:

import multiprocessing
from time import ctime
import yaml
from appium import webdriver

devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
with open(r"E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\config\\\\desired_caps.yaml", 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

def multi_app_start(udid, port):
    desired_caps = 'platformName': data['platformName'],
                    'platformVersion': data['platformVersion'],
                    'deviceName': data['deviceName'],
                    'udid': udid,
                    'appPackage': data['appPackage'],
                    'appActivity': data['appActivity'],
                    'automationName': data['automationName'],
                    'autoGrantPermissions': data['autoGrantPermissions'],
                    'noReset': data['noReset']
                    
    print('appium port:%s start run %s at %s' % (port, udid, ctime()))

    driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
    driver.implicitly_wait(10)
    return driver

# 构建desired进程组
desired_process = []

# 加载desired进程
for i in range(len(devices_list)):
    port = 4723 + 2 * i
    # target="调用的方法",args="传入的参数"
    desired = multiprocessing.Process(target=multi_app_start, args=(devices_list[i], port))
    desired_process.append(desired)

if __name__ == '__main__':
    # 启动多设备执行测试
    for desired in desired_process:
        desired.start()
    # 等所有进程结束后关闭
    for desired in desired_process:
        desired.join()

结果同上,但同时启动,控制台输出的日志中时间一致

对以上代码封装成类

class MultiDevicesSync:
    driver: webdriver = None
    devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']

    def multi_devices_sync(udid, port):
        with open(r"E:\\study\\Fork\\WeiboDemo\\Weibo\\config\\desired_caps.yaml", 'r') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)

        desired_caps = 'platformName': data['platformName'],
                        'platformVersion': data['platformVersion'],
                        'deviceName': data['deviceName'],
                        'udid': udid,
                        'appPackage': data['appPackage'],
                        'appActivity': data['appActivity'],
                        'automationName': data['automationName'],
                        'autoGrantPermissions': data['autoGrantPermissions'],
                        'noReset': data['noReset']
                        
        print('appium port:%s start run %s at %s' % (port, udid, ctime()))

        driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
        driver.implicitly_wait(10)
        return driver

    # 构建desired进程组
    desired_process = []

    # 加载desired进程
    for i in range(len(devices_list)):
        port = 4723 + 2 * i
        # target="调用的方法",args="传入的参数"
        desired = multiprocessing.Process(target=multi_devices_sync, args=(devices_list[i], port))
        desired_process.append(desired)

if __name__ == '__main__':
    multi_devices_sync = MultiDevicesSync()
    # 启动多设备执行测试
    for desired in multi_devices_sync.desired_process:
        desired.start()
    # 等所有进程结束后关闭
    for desired in multi_devices_sync.desired_process:
        desired.join()

补充:

1.进程和线程的区别?

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

线程有时也被称为轻量级进程,是程序执行流的最小单元。线程是进程中的一个实体,一个进程可以包含多个线程,但是线程不能包含多个进程。线程自己不拥有系统资源,在单个程序中同时运行多个线程完成不同的工作,成为多线程。

区别:

数据空间的分配,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。

可以将进程看成是一个工厂,多个进程就是多个工厂;把线程看成是工厂里面的流水线,一个工厂中可以同时有多个流水线。

 福利

python+appium自动化测试-appium并发测试之多设备启动(代码片段)

一、启动appium服务器(文末有福利哦)1.通过命令行窗口启动单个appium服务器appium--直接打开默认的4723端口号appium-p4723--使用-p来启动固定端口号的appium服务器2.通过命令行窗口启动多个appium服务器appium-p4723appium-p4726二、启... 查看详情

移动自动测试python+appium+selenium的问题

...ium【发布时间】:2021-08-2713:12:44【问题描述】:我是移动自动化的新手。我以为我明白了要点,但我遇到了一个问题。使用命令send_keys()时出错selenium.common.exceptions.InvalidElementStateExcept 查看详情

appium自动化测试学习笔记——appium原理

Appium简介开源、跨平台、多语言支持的移动应用自动化工具可测对象原生应用APP、混合应用APP、移动WebAppAPP运行环境:真机、模拟器测试对象App运行平台IOS、Android(目前这两种是市场主流);Windows、FirefoxOS。测试程序运行平台支... 查看详情

appium自动化测试之环境安装

title:Appium自动化测试之环境安装date:\'2019-08-2219:06:45\'updated:\'2019-08-2219:10:37\'tags:[appium,移动端自动化,python]permalink:/articles/2019/08/22/1566472004945.html安装前准备:Python安装包下载Node-v6.11.2下载安卓SDK下载appium_forwindows下载以上四个文件... 查看详情

appium自动化测试

一、认识Appium二、自动化环境搭建安装JDK推荐安装jdk1.8版本,不然使用uiautomatorviewer定位元素时可能会有问题。安装AndroidStudio1.使用AndroidStudio的模拟器。当然,还可以使用其他模拟器,如网易木木、夜神模拟器。2.使用uiautomatorvi... 查看详情

测试appium原理

...​​​​被测设备为苹果​​前言Appium是一块主流的移动自动化测试框架,支持跨语言(如Java,Python等)Appium的实现原理被测设备为安卓对于安卓被测设备,目前可以选择​​UIAutomator​​​和​​UIAutomator2​​作为底层的测试... 查看详情

自动化测试appium之python运行环境搭建part1

实践环境Win7Python3.4.0JAVAJDK1.8.0_121node.js8.11.1LTS下载地址:https://nodejs.org/en/Appium-Python-ClientAppium-Python-Client-0.26.tar.gz下载地址:https://pypi.org/project/Appium-Python-Client/#file 查看详情

python+appium实现app自动化测试(代码片段)

Python+Appium实现app自动化测试一、Appium简介Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windowssdk编写的应用。移动网页应用是通过移动... 查看详情

一路踩坑,搭建的appium自动化测试环境

因为最近本人准备搞app自动化,所以就搭建环境过程记录下来(主要踩过好几个坑)期间有点烦躁,后面调整了下心态还是成功弄好了。  一、Appium环境搭建准备软件所需要到的软件如下:1.安装JDK1.8及以上版本(32位的... 查看详情

appium+python编写自动化脚本

...样手动使用appium-desktop启动测试机上的app,但我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就尝试写Python脚本启动app并登陆app。环境为Windows10+Python3.7+appium1.18.0+Android手机+今日头条app+Pycharm具体的获取... 查看详情

appium定义接口测试(代码片段)

...id‘  desired_cap[‘deviceName‘]=‘AndroidEmulator‘  #指定自动化引擎  #desired_cap[‘automat 查看详情

python+appium+yaml安卓ui自动化测试分享(代码片段)

一、实现数据与代码分离,维护成本较低,先看看自动化结构,大体如下:testyaml管理用例,实现数据与代码分离,一个模块一个文件夹public存放公共文件,如读取配置文件、启动appium服务、读取Yaml文件、定义日志格式等page存... 查看详情

Appium v​​s Espresso 用于自动化测试框架

】Appiumv​​sEspresso用于自动化测试框架【英文标题】:AppiumvsEspressoforautomatedtestingframework【发布时间】:2016-06-0516:55:51【问题描述】:过去几周,我使用Appium(python)进行android测试,但昨天我们决定转向Expresso(Java)进行自动化测试... 查看详情

移动端自动化测试appium环境搭建

自动化测试有主要有两个分类,接口自动化和ui自动化,ui自动化呢又分移动端的和web端的,当然还有c/s架构的,这种桌面程序应用的自动化,使用QTP,只不过现在没人做了。 web自动化呢,现在基本上都是用selenium,webdriver这... 查看详情

appium是个什么?

Appium是一个APP的自动化框架,可用于测试APP、网页(web)、混合型应用,而且是跨平台(可以针对不同平台用一套api来编写测试用例)的,Appium的特点:1、使用自动化来测试一个app,且不需要重新编译它2、写自动化case(用例),不... 查看详情

appium自动化测试

publicstaticvoidmain(String[]args)throwsException{AndroidDriverdriver; DesiredCapabilitiescap=newDesiredCapabilities(); cap.setCapability("automationName","Appium");//appium做自动化// cap.setCapability(" 查看详情

appium--环境搭建

 Appium是一个移动端的自动化框架,可以做H5、Web测试、可以做功能测试(Android、IOS)、可以做跨进程测试,且是跨平台的。Appium做测试的时候支持的语言有很多种,包括java、Python、ruby、PHP、C#等。由于我熟悉java,后续的demo... 查看详情

appium移动端自动化测试一

最近公司决定使用appium为主体框架做一个移动端得自动化测试系统,我会陆续记录项目得进展。1.首先是appium环境得搭建,需要安装appium-server,appium-desktop,android-sdk等一系列工具,编译工具我用的是IDEA 这些安装请自行百度。... 查看详情