前面课程只是启动了单个appium服务,只能控制单台设备。如果需要针对多台设备测试那么该如何处理?
首先看下面两个启动appium服务案例。
启动appium服务1
C:\Users\Shuqing>appium -p 4723
[Appium] Welcome to Appium v1.7.2
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
启动appium 服务2
C:\Users\Shuqing>appium -p 4725
[Appium] Welcome to Appium v1.7.2
[Appium] Non-default server args:
[Appium] port: 4725
[Appium] Appium REST http interface listener started on 0.0.0.0:4725
上面案例我们启动了2个不同的appium服务器,他们通过不同的端口来区分不同的服务;如同百米赛跑要给不同的运动员安排不同的赛道,每个运动员也只能在自己指定的赛道进行比赛。
Appium常用参数
参数
默认值
含义
-U, --udid
null
连接物理设备的唯一设备标识符
-a, --address
0.0.0.0
监听的 ip 地址
-p, --port
4723
监听的端口
-bp, --bootstrap-port
4724
连接Android设备的端口号(Android-only)
-g, --log
null
将日志输出到指定文件
--no-reset
false
session 之间不重置应用状态
--session-override
false
允许 session 被覆盖 (冲突的话)
--app-activity
null
打开Android应用时,启动的 Activity(Android-only) 的名字
--app
null
本地绝对路径_或_远程 http URL 所指向的一个安装包
更多参数请输入命令: appium -h
Appium安卓手机每次运行时都要安装 Unlock、Setting解决方案
首先通过如下命令找到appium的安装路径
C:\Users\Shuqing>where appium
C:\Users\Shuqing\AppData\Roaming\npm\appium
C:\Users\Shuqing\AppData\Roaming\npm\appium.cmd
1.打开 C:\Users\Shuqing\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-driver\lib 中的android-helpers.js
#注释475行如下代码
//await helpers.pushSettingsApp(adb);
#注释486行如下代码
//await helpers.pushUnlock(adb);
2.打开C:\Users\Shuqing\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-driver\build\lib中的android-helpers.js
#注释1128行下面这行代码
//return _regeneratorRuntime.awrap(helpers.pushSettingsApp(adb));
#修改为如下:
return context$1$0.abrupt(\'return\', defaultIME);
#注释1163行下面这行代码
//return _regeneratorRuntime.awrap(helpers.pushUnlock(adb));
#修改如下:
return context$1$0.abrupt(\'return\', defaultIME);
修改完成后重启Appium服务即可,如果新设备没有这个两个守护App可以手动安装这两个App到设备。
Appium Setting路径 :
{appium安装路径}\node_modules\_io.appium.settings@2.4.0@io.appium.settings\app\build\outputs\apk\settings_apk-debug.apk
eg:
C:\Users\Shuqing\AppData\Roaming\npm\node_modules\appium\node_modules\_io.appium.settings@2.4.0@io.appium.settings\app\build\outputs\apk\settings_apk-debug.apk
Unlock app路径:
appium安装路径\node_modules\_appium-unlock@2.0.0@appium-unlock\bin \unlock_apk-debug.apk
eg:
C:\Users\Shuqing\AppData\Roaming\npm\node_modules\appium\node_modules\_io.appium.settings@2.4.0@io.appium.settings\app\build\outputs\apk\unlock_apk-debug.apk
多设备启动
前面我们已经启动了多个appium服务,那么接下来我们可以基于这些服务来启动不同的设备。
测试场景
连接以下2台设备,然后分别启动考研帮App
设备1:127.0.0.1:62001
设备2:127.0.0.1:62025
代码实现
multi_device.py
from appium import webdriver
import yaml
from time import ctime
with open(\'desired_caps.yaml\',\'r\')as file:
data=yaml.load(file)
devices_list=[\'127.0.0.1:62001\',\'127.0.0.1:62025\']
def appium_desire(udid,port):
desired_caps={}
desired_caps[\'platformName\']=data[\'platformName\']
desired_caps[\'platformVersion\']=data[\'platformVersion\']
desired_caps[\'deviceName\']=data[\'deviceName\']
desired_caps[\'udid\']=udid
desired_caps[\'app\']=data[\'app\']
desired_caps[\'appPackage\']=data[\'appPackage\']
desired_caps[\'appActivity\']=data[\'appActivity\']
desired_caps[\'noReset\']=data[\'noReset\']
print(\'appium port: %s start run %s at %s\' %(port,udid,ctime()))
driver=webdriver.Remote(\'http://\'+str(data[\'ip\'])+\':\'+str(port)+\'/wd/hub\',desired_caps)
return driver
if __name__ == \'__main__\':
appium_desire(devices_list[0],4723)
appium_desire(devices_list[1],4725)
多进程并发启动设备
上面的案例设备启动并不是并发进行的,而是先后执行。如何实现2台设备同时启动,并启动App呢?
测试场景
同时启动2台设备:\'127.0.0.1:62025\'和\'127.0.0.1:62001\'并打开考研帮app
实现思路
可以使用Python多线程或者多进程实现。这里我们推荐使用多进程( multiprocessing) 原因如下: