ios+appium+python多机自动化的实现

iOS自动化难点

iOS多机自动化的难点不在appium,而是在于wda

appium区分不同端口启动多个服务,多线程或者多进程获取driver即可;

但iOS自动化的实现依赖xcode编译安装wda,而xcode没法同时支持多个iOS真机,因此阻塞;

调研发现有两个绕过xcode的办法:

1.使用appium自带的wda代替xcode wda;

2.使用tidevice代替xcode启动wda

但是第二种方式依赖设备上已安装wda,而appium启动的时候,会先删除设备上原有的wda,所以这一方式是否可行有待验证。

最后决定使用appium wda代替xcode。

appium自带的wda不能直接用,需要在xcode里面调试好了再用,可以拿以前能正常跑的wda,替换到appium目录里。

​​

appium的日志可以看出来,启动后,会先删除手机上原有的wda,然后重新安装wda,在日志里可以看到appium使用的wda的路径:

/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

在终端中 open /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/

​​

把以前调试通过的wda项目替换进去。

一、多设备连接电脑

查看设备列表

tidevice list

二、启动多个appium服务

开不同的端口,启动多个appium服务;

如果是桌面版appium:

在应用程序中找到appium,右键-》显示包内容,

点开macOS文件夹,能够看到appium可执行文件;


​​多次点击可以打开多个appium服务;

针对每个设备新开一个端口;

打开appium服务器,选择advanced;

​​
设置Sever Port,WebDriverAgent Port,按照递增1的规律,点击’Save As Presets’命名并保存;

WebDriverAgent Port默认是8100端口,新开的第二个appium需要换成其他端口,比如8101;

点击’Presets’,选中想要启动的预设值端口,点击’Start Server V1.21.0’,后面可以根据需要几个iOS手机,启动几个appium服务;

效果:

如果电脑上装的是桌面版的appium,好像不能通过命令启动。

如果是命令行appium服务:

appium -a 127.0.0.1 -p 4723 -bp 4728 --chromedriver-port 9519 -U 255d50d7 --session-override

三、维护设备参数信息

把参数统一维护在一个配置文件里;device_config_iOS.json

[
  {
    "url": "http://127.0.0.1:4723/wd/hub",
    "desired_caps": {
      "platformName": "ios",
      "deviceName": "iPhone7P",
      "platformVersion": "13.6.1",
      "bundleId": "xxx",
      "udid": "xxxx",
      "clearSystemFiles": "true"
    }
  },
  {
    "url": "http://127.0.0.1:4725/wd/hub",
    "desired_caps": {
      "platformName": "ios",
      "deviceName": "iPhone11",
      "platformVersion": "15.1",
      "bundleId": "xxx",
      "udid": "xxxx",
      "clearSystemFiles": "true"
    }
  }]

四、多进程或者多线程进行设备与appium的连接,获取driver

#获取设备信息,判断使用哪台设备
def match_devices():
    cmd = "tidevice list"
    f = os.popen(cmd,"r")
    get_device_data = f.readlines()
    f.close()
    # print(get_device_data)
    n = len(get_device_data)
    device_data = get_device_data[1:]
    print(device_data)
    device_list = []
    for ch in device_data:
        device = ch.split(' ')[0]
        print(device)
        device_list.append(device)
    print(device_list)#得到设备序列号列表
    match_list = []
    data = load_config()
    for i in range(len(data)):
        if data[i]["desired_caps"]["udid"] in device_list:
            match_list.append(i)
    print(match_list)
    return match_list


def connect_appium(url,desired_caps):
    #appium进行设备连接
    driver = webdriver.Remote(command_executor=url,desired_capabilities=desired_caps)
    return driver
    
    
    
def test_case_steps(url,desired_caps):
    # start_appium(url,desired_caps)
    device_driver = connect_appium(url,desired_caps)
    print('test start =================')
    # run_allTest.run()
    time.sleep(5)
    print("test end ===================")
    # device_driver.quit()
    
 
if __name__ == '__main__':
 
    with open("device_config.json", "r") as f:
        data = list(json.load(f))
 
    for i in match_list:
        a = threading.Thread(target=test_case_steps,args=(data[i]["url"],data[i]["desired_caps"]))
        a.start()

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/Vermouth_00/article/details/134247590