Selenium Grid方案介绍之appium 客户端的自动化应用02
5.appium节点注册hub
1)开启一个节点:如果在该台设备上只是启动一个节点,使用命令:
appium --nodeconfig appium_node.json
2)如果在设备上需要注册多个节点的时候,appium server开启的不止是4723一个端口,因此当默认开启一个端口后,开启另一个节点的时候要指定端口,另外需要增加一个配置文件如下(开启一个节点要对应一个配置文件)
appium -p 5723 --nodeconfig appium_node02.json
appium_node02.json配置如下:
{
"capabilities":
[
{
"browserName": "android",
"version":"7.0",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:5723/wd/hub",(修改为5723端口)
"host": "127.0.0.1",
"port": 5723,(修改为5723端口)
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "192.168.31.69",
"hubProtocol": "http"
}
}
注册成功:
6.运行多台模拟器
1)可以使用真机也可使用模拟器,我这里使用的是两个模拟器,一个网易MUMU,版本6.0,另外一个是android studio 自带的模拟器,版本7.0;
2)http://127.0.0.1:5723/wd/hub中的wd就是webdriver的协议
3)多台模拟器在一台设备上运行时,需要指定模拟器,用-s,-s一定要紧跟在adb后面才生效, 一般公司app只能通过欢迎页访问才允许进去的,其他页面能够进去的也可能有
使用 adb -s emulator-5554 logcat|grep -i Displayed
4)启动app,命令一定要输入对了,一开始我这里命令忘记输入了am,然后提示:must be root
adb -s emulator-5554 shell am start -n com.xueqiu.android/.view.WelcomeActivityAlias
from appium import webdriver
from gevent.libev.corecext import os
class TestGrid():
def setup(self):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '6.0'
desired_caps['appPackage'] = 'com.xueqiu.android'
desired_caps['appActivity'] = '.view.WelcomeActivityAlias'
desired_caps['noReset'] = 'true'
desired_caps['dontStopAppOnReset'] = 'true'
desired_caps['skipDeviceInitialization'] = 'true'
desired_caps['unicodeKeyboard'] = 'true'
desired_caps['resetKeyboard'] = 'true'
# udid从外部获取参数
udid = os.getenv('udid')
desired_caps['udid'] = udid
self.driver = webdriver.Remote('http://192.168.31.69:4444/wd/hub', desired_caps)
self.driver.implicitly_wait(10)
def teardown(self):
self.driver.quit()
def test_xueqiu(self):
"""
1.打开雪球app
2.点击搜索输入框
3.想搜索框中输入京东
4.在搜索结果里面选择京东,然后进行点击
"""
self.driver.find_element_by_id('com.xueqiu.android:id/tv_search').click()
self.driver.find_element_by_id('com.xueqiu.android:id/search_input_text').send_keys('京东')
self.driver.find_element_by_xpath("//*[@resource-id='com.xueqiu.android:id/name' and @text='京东']").click()dang
当多台模拟器运行的时候,可以通过指定platformVersion的版本,appium server会识别到脚本中的模拟器的版本号去运行,但是当模拟器版本号相同时呢,所以就需要使用udid,如果版本都是6.0,就会根据devicename去判断,udid影响大于版本号的影响
还有一点需要注意的是⚠️❗️❗️:
self.driver = webdriver.Remote('http://192.168.31.69:4444/wd/hub', desired_caps)
而不是我们原来没有用grid的时候的http://localhost:4723/wd/hub了!!,http://192.168.31.69:4444/wd/hub是启动hub时,生成的ip和端口,脚本是和hub通信,然后通过hub分发到各个节点中去的
7.运行:
cd 到脚本所在路径,在控制台中输入: udid=emulator-5554 pytest 脚本名字.py
注意⚠️❗️我们还可以通过编写shell脚本去运行多台本机设备, 但是仅限于本机,run.sh 一般处于项目的根目录,灵活使用,放在test_case中也是没有问题的
脚本如下:run.sh
#!/bin/bash
for i in $(adb devices|grep "device$"| awk '{print $1}')
do
echo "start:${i}"
udid=$i pytest testGrid.py &(⚠️这里我们可以根据自己的需要指定不同的命令)
done

脚本解析:
sh run.sh
desired_caps['systemPort']=utils.free_port()
那这个端口是什么呢?就是在我们注册节点到hub上时,生成的一个随机端口
浙公网安备 33010602011771号