准备:

一台真机一台模拟器(使用的是“夜神模拟器”)

先查看是否检测到设备  adb devices

  

由上图可看出没有检测到模拟器(夜神模拟器已开启)

可通过以下配置完成:

第一步:找到adb的安装路径,找到adb.exe

第二步:将adb.exe复制到夜神模拟器下安装路径下的bin,更改名称为  nox_adb.exe;

因为夜神模拟器的安装路径下已经有相同名字的文件,复制粘贴前请做好区分,如下图可先将之前的nox_adb.exe 加了_1做区分;adb.exe也一样需要做区分(或者提前改好adb.exe的名称)

再次adb devices时,可检测到模拟器

但是连接上真机的时候,又只检测到真机,不连接真机也没有检查到模拟器

这时候执行命令:adb connect 127.0.0.1:62001

能检测到模拟器,再连接上真机后,真机和模拟器都能检测到

启动多个appium服务

前提:已安装yaml 模块(pip install  pyyaml )和 tomorrow框架 (pip install tomorrow)

1.启动appium服务,可以用命令行模式

比如

第一个appium服务,可以指定一个端口 -p 4723,然后指定一个设备名称 -u 【真机】,也就是-U参数(adb devices可以查看),-bp是指定bootstrap-port

(多个appium启动链接多个android设备时需要设置不同的 bootstrap-port )

appium -a 127.0.0.1 -p 4723 -bp 4726 -U ML5RRPCUWO

第二个appium 服务指定设备名称【夜神模拟器】

appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001

def start_appium(port, bootstrap, 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("start /b appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
# appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001
os.system("start /b appium -a 127.0.0.1 -p %s -bp %s -U %s" % (port, bootstrap, udid)) def stop_appium(): # 关闭所有的appium进程
os.system("start /b taskkill /F /t /IM node.exe")

2.

A.运行不同手机时候,desired_caps的参数配置肯定也是需要多个的,用yaml文件可以管理多个desired_caps配置,方便查看

B.yaml文件配置

pycharm新建一个文件,名称以 .yaml结尾即可

- desc: 设备名称_真机1,appium启动服务端口号_4723
port:
desired_caps:
platformName: Android
deviceName: ML5RRPCUWO
appPackage: com.zhijiepay.android
noReset: !!bool True
platformVersion: 5.1.
udid: ML5RRPCUWO
appActivity: .ui.login.ui.Splash_Activity
newCommandTimeout:
bootstrap-port: - desc: 设备名称_夜神,appium启动服务端口号_4724
port:
desired_caps:
platformName: Android
deviceName: 127.0.0.1:
appPackage: com.zhijiepay.android
noReset: !!bool True
platformVersion: 4.4.
udid: 127.0.0.1:
appActivity: .ui.login.ui.Splash_Activity
newCommandTimeout:
bootstrap-port:

C.

读yaml配置

1).读出来多个配置是list类型,desc是设备的描述,可以通过描述来找到对应的设备名称,如:真机1

2).返回desired_caps配置信息和port端口号以及bootstrap-port

def get_desired_caps(devices_name):
"""
从yaml读取desired_caps配置信息
参数name:设备名称,如:夜神/真机
:return: desired_caps字典格式 """
# curpath = os.path.dirname(os.path.realpath(__file__))
yamlpath = os.path.join(yaml_path, "yaml_appium.yaml")
print("配置地址:%s" % yamlpath)
f = open(yamlpath, "r", encoding="utf-8")
a = f.read()
f.close()
# 把yaml文件转字典
d = yaml.load(a)
for ii in d:
if devices_name in ii["desc"]: # 判断输入的设备名称是否存在
print(ii)
# 启动服务
devicesname = ii['desired_caps']['udid']
print("devicesName: %s" % devicesname)
# print("port: %s" %ii['port'])
start_appium(port=ii['port'], bootstrap=ii['bootstrap-port'], udid=ii['desired_caps']['udid'])
# start_appium(port=ii['port'], udid=devicesName)
return ii['desired_caps'], ii['port']
完整代码如下:
# coding=utf-8
from appium import webdriver
import time
import yaml
import os
from tomorrow import threads
from src.pages import login_page
from config.globalparameter import login_name, login_password, yaml_path def start_appium(port, bootstrap, 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("start /b appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
# appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001
os.system("start /b appium -a 127.0.0.1 -p %s -bp %s -U %s" % (port, bootstrap, udid)) def stop_appium(): # 关闭所有的appium进程
os.system("start /b taskkill /F /t /IM node.exe") def get_desired_caps(devices_name):
"""
从yaml读取desired_caps配置信息
参数name:设备名称,如:夜神/真机1
:return: desired_caps字典格式 """
# curpath = os.path.dirname(os.path.realpath(__file__))
    yamlpath = os.path.join(yaml_path, "yaml_appium.yaml")
print("配置地址:%s" % yamlpath)
f = open(yamlpath, "r", encoding="utf-8")
a = f.read()
f.close()
# 把yaml文件转字典
d = yaml.load(a)
for ii in d:
if devices_name in ii["desc"]: # 判断输入的设备名称是否存在
print(ii)
# 启动服务
devicesname = ii['desired_caps']['udid']
print("devicesName: %s" % devicesname)
# print("port: %s" %ii['port'])
start_appium(port=ii['port'], bootstrap=ii['bootstrap-port'], udid=ii['desired_caps']['udid'])
# start_appium(port=ii['port'], udid=devicesName)
return ii['desired_caps'], ii['port'] @threads(2)
def run_app(devices_name):
# 配置参数
desired_caps = get_desired_caps(devices_name)
print(desired_caps)
print(desired_caps[1])
# 执行代码
driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0])
time.sleep(5)
login_page1 = login_page.login_page(driver)
login_page1.input_user(login_name)
login_page1.input_Pws(login_password)
login_page1.click_btnLogin()
# self.driver.find_element_by_id('com.zhijiepay.android:id/but_OK').click()
# 设置隐式等待时间
driver.implicitly_wait(3)
time.sleep(5) if __name__ == "__main__":
devices = ["夜神", "真机1"]
for i in devices:
run_app(devices_name=i)
stop_appium()

启动多个appium服务(同时运行多台设备)的更多相关文章

  1. appium+python自动化60-windows上同时启动多个appium服务,让多个android机器并行运行

    前言 做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行.有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性. 这就需要启动多个appium服务 ...

  2. Appium+Python app自动化测试之脚本启动和停止Appium服务

    研究了一段时间的Appium android app的自动化测试,工作中需要连接多台手机终端同时执行测试用例,我实现的方式是获取用例中需要执行用例的设备id个数以及实际连接到的设备数(通过adb de ...

  3. 用命令方式启动、停止appium服务和app

    启动appium服务并监听一个端口命令: 命令command==> appium -a {ip} -p {port} -U {deviceName} -g {log} 以shell命令方式执行命 ...

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

    简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...

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

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

  6. appium--python启动appium服务

    前戏 前面我们都是在cmd下通过输入appium加端口号来启动服务的,在我们做自动化的时候,我们当然不希望我们手动启动appium服务,而是希望通过脚本自动启动appium服务. 我们可以使用subp ...

  7. 第四章 Appium真机运行测试用例讲解

    -----手机自动化之Appium 手机自动化测试用例虽然可以在模拟器上运行,可是模拟器毕竟和真机还是有区别的.在第二章我们讲到了模拟器上运行测试用例后,我又花了两天的时间,研究了一下真机运行测试用例 ...

  8. appium自动化测试框架——自动化启动多台设备思路梳理

    今天,我们聊一聊如果自动化实现在多台设备上运行脚本. 一.首先我们回忆一下如何在一台设备上运行python脚本,一般分为三步 1.启动appium服务 2.创建驱动 3.运行python脚本 同样的, ...

  9. jenkins启动appium服务

    想在jenkins中,自动定时启动appium服务,shell命令已准备如下: BUILD_ID=dontKillMe echo "" > appium.log nohup ...

随机推荐

  1. WSTMart开发文档

    WSTMart开发文档页面   PC版   开源版 授权版   序言   WSTMart安装协议   WSTMart电商系统安装   商城前台安装操作指南   用户中心指南   商家中心操作指南   ...

  2. 怎样知道自己机器的出口网关IP(即外部IP)

    方法一: 在浏览器中输入 :  http://www.ip138.com/ 可以查到外部IP地址及地理位置 方法二: Just put in  “where is my ip” in google t ...

  3. HDU 5117 Fluorescent (数学+状压DP)

    题意:有 n 个灯,初始状态都是关闭,有m个开关,每个开关都控制若干个.问在m个开关按下与否的2^m的情况中,求每种情况下亮灯数量的立方和. 析:首先,如果直接做的话,时间复杂度无法接受,所以要对其进 ...

  4. Redis Quick Start [熟练版]

    一.下载解压 wget http://download.redis.io/redis-stable.tar.gztar xvzf redis-stable.tar.gzcd redis-stable ...

  5. linux每天一小步---tail命令详解

    1 命令功能 tail命令用于显示文件中末尾的内容(默认显示最后10行内容) 2 命令语法 tail [选项参数] [文件名1] [文件名2] 3 命令参数 -f  用于循环读取文件的内容,监视文件的 ...

  6. window.location 对象

    http://www.home.com:8080/windows/location/page.html?ver=1.0&id=timlq#love 1, window.location.hre ...

  7. spark配置文件和执行部分代码

    export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER-Dspark.deploy.zookeeper.ur ...

  8. linux 搭建php网站许愿墙

    网站素材在:https://i.cnblogs.com/Files.aspx 首先需要搭建本地yum源,详情参考: http://www.cnblogs.com/jw35/p/5967677.html ...

  9. ARPG游戏打击感相关的技术简单总结

    说好的技术总结,根据近期的工作总结一下体现游戏打击感相关的技术.一般arpg的游戏打击感除了场景的氛围的烘托,策划的数值:连击,奖励伤害数字的连贯积累反馈,硬直加物理击飞ragdoll,更不可忽视的也 ...

  10. Objective-C 学习笔记(五) 指针

    Objective-C 指针 每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问. a. 我们定义一个指针变量 b. 分配一个指针变量 ...