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()