appium+python自动化59-多台设备并行
前言
做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行。有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性。
这就需要启动多个appium服务了,并且android设备和appium要一一对应才行。
启动多个手机
1.这里以夜神模拟器和雷电模拟器为例,先启动这2个设备
2.adb devices查看设备名称,多个设备会显示多行数据
启动多个appium服务
1.启动appium服务,可以用命令行模式,在cmd里面启动,可以参考上一篇 appium命令行参数
比如第一个appium服务,可以指定一个端口4730,然后指定一个设备名称【雷电模拟器】,也就是-U参数(adb devices可以查看)
appium -a 127.0.0.1 -p 4730 -U emulator-5554 —no-reset
2.第二个appium 服务指定设备名称【夜神模拟器】
appium -a 127.0.0.1 -p 4740 -U 127.0.0.1:62001 —no-reset
yaml管理配置
1.运行不同手机时候,desired_caps的参数配置肯定也是需要多个的,如何高效的管理多个desired_caps配置呢?
这里我用yaml文件去管理,更方便查看
desired_caps = { 'platformName': 'Android', # 手机是Android还是ios 'deviceName': 'emulator-5554', 'platformVersion': '5.1.1', # android版本号 'noReset': True, # apk包名 # aapt工具查看 'appPackage': 'com.taobao.taobao', # apk的launcherActivity 'appActivity': 'com.taobao.tao.welcome.Welcome' }
2.yaml文件配置如下:
- desc: 设备名称_雷电,appium启动服务端口号_4723 port: 4730 desired_caps: platformName: Android deviceName: emulator-5554 appPackage: com.taobao.taobao noReset: !!bool True udid: emulator-5554 appActivity: com.taobao.tao.welcome.Welcome - desc: 设备名称_夜神,appium启动服务端口号_4724 port: 4740 desired_caps: platformName: Android deviceName: 127.0.0.1:62001 appPackage: com.taobao.taobao noReset: !!bool True udid: 127.0.0.1:62001 appActivity: com.taobao.tao.welcome.Welcome
读yaml配置
1.读出来多个配置是list类型,desc是设备的描述,可以通过描述来找到对应的设备名称,如:雷电
2.返回desired_caps配置信息和port端口号,后面代码会用到
# coding=utf-8 from appium import webdriver import time import yaml import os def get_desired_caps(devicesName='雷电'): ''' 从yaml读取desired_caps配置信息 参数name:设备名称,如:夜神/雷电 :return: desired_caps字典格式 和port ''' curpath = os.path.dirname(os.path.realpath(__file__)) yamlpath = os.path.join(curpath, "taobao.yaml") print("配置地址:%s" % yamlpath) f = open(yamlpath, "r", encoding="utf-8") a = f.read() f.close() # 把yaml文件转字典 d = yaml.load(a) for i in d: if devicesName in i["desc"]: print(i) # 启动服务 start_appium(port=i['port']) return (i['desired_caps'], i['port'])
运行app代码
def run_app(devicesName): # 配置参数 desired_caps = get_desired_caps(devicesName) print(desired_caps) # 执行代码 driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0]) time.sleep(10) # 点注册登陆 driver.find_element_by_xpath("//*[@text='注册/登录']").click() time.sleep(6) # content-desc driver.find_element_by_xpath("//*[@text='请输入手机号码']").send_keys("15001234000") driver.find_element_by_xpath("//*[@text='请输入验证码']").send_keys("1111")
python启动appium服务
1.如果嫌手工端口cmd窗口启动服务麻烦,可以用python去启动appium服务,释放你的双手
先判断服务启了没,没启动的话就执行cmd指令启动
# coding=utf-8 from appium import webdriver import time import yaml import os from tomorrow import threads # 作者:上海-悠悠 QQ交流群:330467341 def start_appium(port=4723, udid=""): a = os.popen('netstat -ano | findstr "%s" '% port) time.sleep(2) t1 = a.read() if "LISTENING" in t1: print("appium服务已经启动:%s" % t1) # s = t1.split(" ") # s1 = [i for i in s if i != ''] # pip = s1[-1].replace("\n", "") else: # 启动appium服务 # appium -a 127.0.0.1 -p 4740 -U emulator-5554 127.0.0.1:62001 --no-reset os.system("appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
多线程运行
1.多线程用一个很简单的tomorrow框架就行
# coding=utf-8 from appium import webdriver import time import yaml import os from tomorrow import threads # 作者:上海-悠悠 QQ交流群:330467341 def start_appium(port=4723, udid=""): a = os.popen('netstat -ano | findstr "%s" '% port) time.sleep(2) t1 = a.read() if "LISTENING" in t1: print("appium服务已经启动:%s" % t1) # s = t1.split(" ") # s1 = [i for i in s if i != ''] # pip = s1[-1].replace("\n", "") else: # 启动appium服务 # appium -a 127.0.0.1 -p 4740 -U emulator-5554 127.0.0.1:62001 --no-reset os.system("appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid)) def get_desired_caps(devicesName='雷电'): ''' 从yaml读取desired_caps配置信息 参数name:设备名称,如:夜神/雷电 :return: desired_caps字典格式 ''' curpath = os.path.dirname(os.path.realpath(__file__)) yamlpath = os.path.join(curpath, "taobao.yaml") print("配置地址:%s" % yamlpath) f = open(yamlpath, "r", encoding="utf-8") a = f.read() f.close() # 把yaml文件转字典 d = yaml.load(a) for i in d: if devicesName in i["desc"]: print(i) # 启动服务 devicesName = i['desired_caps']['udid'] print(devicesName) start_appium(port=i['port'], udid=devicesName) return (i['desired_caps'], i['port']) @threads(2) def run_app(devicesName): # 配置参数 desired_caps = get_desired_caps(devicesName) print(desired_caps) # 执行代码 driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0]) time.sleep(10) # 点注册登陆 driver.find_element_by_xpath("//*[@text='注册/登录']").click() time.sleep(6) # content-desc driver.find_element_by_xpath("//*[@text='请输入手机号码']").send_keys("15001234000") driver.find_element_by_xpath("//*[@text='请输入验证码']").send_keys("1111") # driver.find_element_by_accessibility_id("帮助").click() if __name__ == "__main__": # 作者:上海-悠悠 QQ交流群:330467341 devices = ["夜神", "雷电"] for i in devices: run_app(devicesName=i)
好书推荐:python初学者强烈推荐Python核心编程(第二版),注意是第二版不是第三版,第三版是接着第二版讲的,虽然第二版是python2语法,不影响的,基础的概念但是一样的。点下方购买按钮可以直接入手。
《python自动化测试全栈》课程7月1号开学《python自动化测试全栈》课程-(7/8/9)3个月