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"
  }
}

注册成功:

appium -h 查看帮助,可以看到指定的参数如下:
这些指令我们一般都是放在capabilities里面,而不是在命令里指定

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

5)运行脚本
脚本如下:
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
1)如果不加第5行的&符号就是串行执行,加了就可以并行执行,udid是设置了当前环境的一个参数 
2) 如何在指定设备上运行指定的测试用例,可以根据自己的需要指定不同的命令,加判断逻辑等来扩展我们的运行脚本
8.环境配置中遇到的一些问题
1)hub重启的时候,节点没有关闭的话会自动的注册到hub节点上 注意⚠️,一开始编写脚本的时候,因为没有加self.driver.quit()来自动退出,每次执行完一次脚本,都需要手动去重新注册节点;因为没有退出,上一次的还在运行中,再去使用命令执行脚本的时候,就会处于一直等待的状态
2)ios设备的名称需要填写mac 
3)在配置desired_caps时,正规写法还可以将随机生成的端口号写在配置里,不过不需要配置也是可以的,如果运行脚本出错我们可以使用这个方式试一下
desired_caps['systemPort']=utils.free_port()

 

那这个端口是什么呢?就是在我们注册节点到hub上时,生成的一个随机端口

客户端并行测试, 可以注册多台,启动的时候只用执行一台

 

posted @ 2020-04-25 19:45  zhaikunkun  阅读(213)  评论(0)    收藏  举报