专栏首页从零开始学自动化测试appium+python自动化59-多台设备并行

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语法,不影响的,基础的概念但是一样的。

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang
  • 【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

    腾讯高校合作

扫码关注云+社区

领取腾讯云代金券