Appium 基于 selenium grid 连接多个 appium

测试小书童 · 2016年11月11日 · 最后由 litianping 回复于 2016年12月06日 · 3610 次阅读
本帖已被设为精华帖!
  • 想同时启动多个 appium 并行运行,谷歌后,很多资料都显示用 selenium grid 的方式。找到一张效果图

实践步骤

下载 selenium-server-standalone-xxx.jar

  • 执行命令
java -jar selenium-server-standalone-3.0.1.jar  -port 4444 -role hub

设置不同的端口 appium json 文件信息

  • 配置 json1 端口 4723 文件
{
  "capabilities": [
    {
      "deviceName": "DU2TAN15AJ049163",
      "version": "4.4.2",
      "maxInstances": 3,
      "platform": "ANDROID",
      "browserName": "chrome"
    }
  ],
  "configuration": {
      "cleanUpCycle": 2000,
      "timeout": 300000,
      "browserTimeout": 60000,
      "hub":"127.0.0.1:4444/grid/register",
      "host":"192.168.1.218",
      "maxSession": 6,
      "port": 4723,
      "hubPort": 4444,
      "hubHost": "192.168.1.218",
      "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
      "url": "http://127.0.0.1:4723/wd/hub",
      "register": true,
      "registerCycle": 5000
    }
}
  • 执行命名,启动端口 4723 连接 hub
node D:\\app\Appium\\node_modules\\appium\\bin\\appium.js  -p 4723  -U DU2TAN15AJ049163 --nodeconfig D:\app\appium_study\testRunner\test.json

  • 配置 json2 ,端口为 4724
{
  "capabilities": [
    {
      "deviceName": "MSM8926", #设备id
      "version": "4.3",
      "maxInstances": 3,
      "platform": "ANDROID",
      "browserName": "chrome"
    }
  ],
  "configuration": {
      "cleanUpCycle": 2000,
      "timeout": 300000,
      "browserTimeout": 60000,
      "hub":"127.0.0.1:4444/grid/register", #链接hub
      "host":"192.168.1.218",
      "maxSession": 6,
      "port": 4724,#端口号
      "hubPort": 4444,
      "hubHost": "192.168.1.218",
      "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
      "url": "http://127.0.0.1:4724/wd/hub",# 4724 appium服务器
      "register": true,
      "registerCycle": 5000
    }
}
  • 执行命名,启动端口 4724 连接 hub
node D:\\app\Appium\\node_modules\\appium\\bin\\appium.js  -p 4724  -U MSM8926--nodeconfig D:\app\appium_study\testRunner\test2.json

在看看刚刚执行 selenium-server-standalone 窗口

在浏览器中预览

在浏览器输入:http://192.168.1.218:4444/grid/console 就能看到你连接了多少个设备

其他

  • 这种方式也可以启动多个 web 浏览器的方式,用于多个 web 自动化测试
  • 关于代码对接,还没有对接成功到代码中,如何启动不同的 driver,不同的 driver 放到线程中,现在还没有想好怎么做比较好,有其他想法的小伙伴麻烦帮忙指导下思路
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 16 条回复 时间 点赞

实现起来不难,贴下我实现的代码吧

  • 1.启动 appium,指定 appium 端口和 bootstrap 端口与 device

def start_appium(self):
    """
    启动appium
    p:appium port
    bp:bootstrap port
    :return: 返回appium端口参数
    """

    aport = random.randint(4700, 4800)
    bpport = random.randint(4700, 4800)
    U.cmd("appium -p %s -bp %s -U %s" %
          (aport, bpport, self.device))  # 启动appium
    U.Logging.success('start appium :p %s bp %s' % (aport, bpport,))
    U.sleep(10)
    return aport
  • 2.继承步骤 1 的端口与 device,启动 driver,需要注意的的是 appium 偶尔会启动失败,重试即可
def start_appium(self):
    """
    启动driver
    :return: 
    """

    number_of_starts = 0
    while number_of_starts < 6:
        try:
            self.driver = webdriver.Remote(
                'http://0.0.0.0:%s/wd/hub' %
                self.__get_appium_port(), self.device_l)
            U.Logging.debug('appium start success')
            return self.driver
        except Exception as e:
            number_of_starts += 1
            U.Logging.error('Failed to start appium :{}'.format(e))
            U.Logging.error(
                'Try restarting the appium,Trying the {} frequency'.format(number_of_starts))
            U.sleep(5)
    if number_of_starts == 4:
        U.Logging.error('Can not start appium, the program exits')
        exit()

3.关于多进程,使用 multiprocessing,检查设备数量,同时开启每个设备的进程,实现并行测试

import testcase.Integration
from multiprocessing import Pool


def case_sun(device):
    a = testcase.Integration.RunApp(device)
    a.case_start()


device_list = testcase.Integration.get_device_info()
pool = Pool(len(device_list))
pool.map(case_sun, device_list)
pool.close()
pool.join()

效果图
Alt text

#1 楼 @joko 周末我看看,谢谢分享

—— 来自 TesterHome 官方 安卓客户端

思寒_seveniruby 将本帖设为了精华贴 11月12日 00:15

加精理由: 对官方的方案进行了实际的探索研究. 内容细致. 感谢@lose@joke

社区拿到了一笔定期赞助. 以后精华帖必有打赏. 你们两个快点搞上.

#1 楼 @joko 你好!能方便加下我好友吗?我正在想尝试多设备链接自动化,能教导一下我吗?

我贴一个 PPT

测试小书童 [该话题已被删除] 中提及了此贴 11月14日 12:49

#1 楼 @joko 很好奇你的用例怎么管理的,想和你交流下,看看我的新帖子,有好的意见麻烦帮忙提出来: selenium grid 多进程 (同步,异步) 启动多个 appium

有时间看看,谢谢分享

#9 楼 @lose 用例的组织使用的是 yaml,支持用例的继承,多重继承。常见的场景也有封装在用例里,例如循环用例,等待等

谢谢分享

#11 楼 @joko good,感谢分享经验,现在在做用例基于设备来分配

直接打开两个 appium,然后设置不同端口号,实例化 Device 时连接不同端口号不就可以了吗

#14 楼 @wuhao 嗯,这样是可以的

—— 来自 TesterHome 官方 安卓客户端

appium.cmd --address 127.0.0.1 -p 6666 -bp 10001 --session-override -U 6533d70

你好,我用上面的命令开启多个端口,然后 testng 传递参数给 脚本,问题就是,只有一个手机跑了,另外的手机 全 test ignore

<parameter name="port" value="6666"/>
<parameter name="udid" value="6533d70"/>

#16 楼 @litianping 要启动多个进程,看看这个就知道了 appium+python (二) 支持多设备并行

#17 楼 @lose 你好,我解决了,初始化放在 BeforeClass 就可以了

独行数息 第一帖 中提及了此贴 12月24日 18:09
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册