前言

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

上海-悠悠 QQ交流群:330467341

appium+python自动化60-windows上同时启动多个appium服务,让多个android机器并行运行的更多相关文章

  1. Appium+python自动化20-查看iOS上app元素属性

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...

  2. Appium+python自动化20-查看iOS上app元素属性【转载】

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...

  3. Appium+python自动化(三十七)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 下(超详解)

    简介 接着上一篇继续看一下如何并发测试以及并发测试的过程中,可能遇到的问题,在这里宏哥把宏哥遇到的和小伙伴或者童鞋们,一起分享一下. Appium端口检测 问题思考 经过前面学习,我们已经能够使用py ...

  4. Appium+python自动化8-Appium Python API

    Appium+python自动化8-AppiumPython API   前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...

  5. Appium+python自动化-查看app元素属性

    本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...

  6. Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP

    前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itoo ...

  7. Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP【转载】

    前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itoo ...

  8. appium+python自动化61-中文输入乱码问题解决

    前言 在夜神模拟器上输入中文,发现是乱码,将unicodeKeyboard和resetKeyboard参数设置为True了,发现还是没法解决. 打开手机设置语言和输入法,发现找不到Appium And ...

  9. appium+python自动化50-生成定位对象模板templet(jinja2)

    前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...

随机推荐

  1. Porting of cURL to Android OS using NDK (from The Software Rogue)

    Porting of cURL to Android OS using NDK   In continuing my journey into Android territory, I decided ...

  2. linux shell 正则表达式(BREs,EREs,PREs)的比较

    原文 :   linux shell 正则表达式(BREs,EREs,PREs)差异比较 在使用 linux shell的实用程序,如awk,grep,sed等,正则表达式必不可少,他们的区别是什么 ...

  3. C#窗体内嵌外部程序(cmd.exe)的显示【转载】

    [DllImport("User32.dll ", EntryPoint = "SetParent")] private static extern IntPt ...

  4. 【LOJ】#2351. 「JOI 2017/2018 决赛」毒蛇越狱

    题解 没啥特别好的算法,是个讨论题,由于0 1 ?三类数位中最少的不会超过6 如果1不超过6,那么记录\(f1(S)\)为 \(\sum_{T \subset S} val(T)\)这个可以通过类似F ...

  5. loadrunner测试ajax框架

    loadrunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,解决方法 loadrunnerajax框架测试脚本headerajax [问题描述]用loadrunne ...

  6. 八皇后--python代码

    迭代和递归方法的运用 import random def prettyprint(solution): #图形化处理数据 def line(pos,length=len(solution)): #单行 ...

  7. BeanFactoryAware和BeanNameAware

    实现 BeanFactoryAware 接口的 bean 可以直接访问 Spring 容器,被容器创建以后,它会拥有一个指向 Spring 容器的引用. BeanFactoryAware 接口只有一个 ...

  8. FastReport.Net使用:[30]对话框使用

    使用对话框需要知道的地方  1.按钮的DialogResult属性. 假如DialogResult属性值为OK的按钮被点击,报表将会展现后面的对话框或者报表页:如果属性值为None,则停留在当前窗体: ...

  9. 高并发编程之ReentrantLock

    上文学习jvm提供的同步方法synchronized的用法,一些常见的业务类型以及一道以前阿里的面试题,从中学习到了一些并发编程的一些规则以及建议,本文主要学习jdk提供的同步方法reentrantL ...

  10. HDU 6085 Rikka with Candies(bitset)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6085 [题目大意] 给出一个数组a一个数组b,以及询问数组c, 问对于每个c有多少对a%b=c,答 ...