Appium并发测试(6)-同时在2个设备上启动APP

并发启动Appium服务与多设备测试
本文介绍了一种使用Python多进程并发启动多个Appium服务及在多个设备上启动应用进行自动化测试的方法。通过定义设备列表,利用多进程模块启动Appium服务并检查端口占用情况,确保服务正常运行后再启动应用。

脚本设备思路:

  1. 启动单个服务
  2. 启动单个设备并启动应用
  3. 利用多进程并发启动多个服务(具体设计思路如下)

  1. 利用多进程并发启动多个设备并启动应用(具体设计思路如并发启动多个appium服务)

 

 

完整脚本:

from  time import sleep
import multiprocessing
from multi_appium.multi_server_sync import appium_start
from find_element.desired_caps import appium_desire
from multi_appium.check_port import *

devices_list=['127.0.0.1:62001','0483909e']  #启动多个模拟器
def start_appium_action(host,port):
    #检测端口是否被占用,如果没有被占用则启动appium服务
    if check_port(host,port):
        appium_start(host,port)
        return True
    else:
        print("appium %s start failed!" %port)
        return False
def start_devices_action(udid,port):
    #检测appium服务是否启动,启动成功则再启动app,否则释放端口
    host='127.0.0.1'
    if start_appium_action(host,port):
        appium_desire(udid,port)
    else:
        release_port(port)

def appium_start_sync():
    print("=====并发启动appium服务=====")
    appium_process=[]
    # 加载appium进程
    for i in range(len(devices_list)):
        host = '127.0.0.1'
        port = 4723+2*i
        appium = multiprocessing.Process(target=start_appium_action, args=(host, port))
        appium_process.append(appium)
    for appium in appium_process:
            appium.start()
    for appium in appium_process:
            appium.join()
        #appiumq启动后需要等待几秒后才会启动成功
        #sleep(10)


def devices_start_sync():
    print("=====并发启动设备=====")
    desired_process = []
    # 加载desired进程
    for i in range(len(devices_list)):
        port = 4723+2*i  # 第一个端口号是4723,第二个是4725
        desired = multiprocessing.Process(target=start_devices_action, args=(devices_list[i], port))
        desired_process.append(desired)
    # 同时启动多设备执行测试
    for desired in desired_process:
        desired.start()
    for desired in desired_process:
        desired.join()

if __name__ == '__main__':
    appium_start_sync()
    devices_start_sync()


执行结果:

 

### Python和Appium实现Android多设备并发测试 在Python中使用Appium进行Android多设备并发测试,涉及启动多个Appium服务器、配置设备参数以及通过多线程或多进程实现并发。以下是详细的实现方法: #### 1. 启动多个Appium服务器 为了支持多设备并发测试,每个设备需要一个独立的Appium服务器实例。可以通过指定不同的端口号(`-p`)和Bootstrap端口号(`-bp`)来启动多个Appium服务器[^2]。例如: ```bash appium -a 127.0.0.1 -p 4723 -bp 4726 -U <device_id_1> appium -a 127.0.0.1 -p 4727 -bp 4728 -U <device_id_2> ``` 其中: - `-a`:指定Appium服务器绑定的IP地址。 - `-p`:指定Appium服务器监听的端口号。 - `-bp`:指定Bootstrap端口号。 - `-U`:指定连接的设备ID。 #### 2. 配置设备参数 设备参数可以通过YAML文件进行管理,便于动态加载和修改。以下是一个示例YAML配置文件[^5]: ```yaml platformName: Android platformVersion: "11" deviceName: "Android Emulator" udid: appPackage: "com.example.app" appActivity: ".MainActivity" automationName: "UiAutomator2" autoGrantPermissions: true noReset: true url: "127.0.0.1" ports: - 4723 - 4727 devices: - U4AIUKFAL7W4MJLR - U4AIUKFAL7W4MHUHUDS ``` 加载YAML文件并为每个设备生成对应的desired capabilities: ```python import yaml def load_config(file_path): with open(file_path, 'r') as file: data = yaml.load(file, Loader=yaml.FullLoader) return data def generate_desired_caps(data, 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'] } return desired_caps, port ``` #### 3. 实现多进程并发启动设备 可以使用`multiprocessing`模块实现多进程并发启动设备[^4]。以下是一个完整的代码示例: ```python from appium import webdriver from multiprocessing import Process import yaml import time # 加载配置文件 config = load_config(r"config.yaml") def start_appium_server(platform_name, port): # 模拟启动Appium服务器的逻辑 print(f"Starting Appium server on port {port} for {platform_name}") time.sleep(2) # 模拟启动时间 def stop_appium_server(platform_name, port): # 模拟停止Appium服务器的逻辑 print(f"Stopping Appium server on port {port} for {platform_name}") def run_cases(device, port): desired_caps, _ = generate_desired_caps(config, device, port) driver = webdriver.Remote(f"http://{config['url']}:{port}/wd/hub", desired_caps) driver.implicitly_wait(10) print(f"Running test cases on {device} at port {port}") time.sleep(5) # 模拟测试用例执行时间 driver.quit() if __name__ == "__main__": processes = [] for index, device in enumerate(config['devices']): port = config['ports'][index] # 启动Appium服务器 start_appium_server("Android", port) # 创建多进程任务 p = Process(target=run_cases, args=(device, port)) processes.append(p) p.start() # 等待所有进程完成 for p in processes: p.join() # 停止Appium服务器 for index, device in enumerate(config['devices']): port = config['ports'][index] stop_appium_server("Android", port) ``` #### 4. 注意事项 - 确保每个设备的端口号唯一,避免端口冲突[^3]。 -测试完成后,记得关闭所有Appium服务器实例以释放资源。 - 使用`ThreadPoolExecutor`或`ProcessPoolExecutor`可以进一步简化多线程或多进程的实现[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miss糖豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值