如何确保appium节点仅连接到一部手机?

时间:2017-10-30 14:19:51

标签: android session appium watir selenium-grid

我运行(所有在一台机器上)多个appium服务器作为节点连接到selenium-grid集线器,我有多个电话连接到我的adb端口5555(在我的情况下通过WiFi)。

问题我对此有三个手机中的两个具有匹配的功能(Android 7.1.1,Chrome浏览器)。因此,当我为nexus 9启动测试时,如果占用nexus 6的网格节点。或者反过来,我要求在nexus 6上运行测试,这个被占用,但测试运行在nexus 9.所以我想要/需要的是一个我可以使用的配置,使其足够独特,可以启动仅连接到一部手机的appium服务器。

我的设置

  • Windows 10(x64)
  • Ruby v2.3.3(32位),带有gems watir v6.8.4, selenium-webdriver v3.6.0
  • Selenium-Standalone-Server v3.6.0
  • Appium Desktop v1.2.5(服务器v1.7.1)
  • 或通过命令行Appium server v1.6.5

测试设备

  • Nexus 5(手机) - Android 6.0.1 - 192.1.1.120:5555(在adb设备列表中)
  • Nexus 6(手机) - Android 7.1.1 - 192.1.1.63:5555(在adb设备列表中)
  • Nexus 9(平板电脑) - Android 7.1.1 - 192.1.1.55:5555(在adb设备列表中)

网格

java -jar selenium-standalone-server3.6.0.jar -role hub

通过命令行(或桌面应用程序)启动appium服务器

appium -a 0.0.0.0 -p 4723 -bp 4724 --nodeconfig node_nexus5.json

appium -a 0.0.0.0 -p 4725 -bp 4726 --nodeconfig node_nexus6.json

appium -a 0.0.0.0 -p 4727 -bp 4728 --nodeconfig node_nexus9.json

node_nexus6.json(节点5和9仅在platformVersion,deviceName,udid和applicationName中不同)

{
  "capabilities":[
    {
    "platform": "ANDROID",
    "platformName": "Android",
    "platformVersion": "7.1.1",
    "browserName": "chrome",
    "version": "6",
    "deviceName": "Nexus6",
    "udid": "192.1.1.63:5555",
    "applicationName": "Nexus6",
    "maxInstances": 1
    }
  ],
  "configuration":
    {
    "cleanUpCycle":2500,
    "timeout":30000,
    "maxSession": 1,
    "register": true,
    "registerCycle": 1000,
    "hubPort": 4444,
    "hubHost": "localhost"
    }
}

我尝试了什么

deviceName,applicationName,版本功能

browser = Watir::Browser.new :chrome, {
    url: "http://localhost:4444/wd/hub",  
    platformName: "Android",
    platformVersion: "7.1.1",
    browserName: "chrome",
    version: "6",
    deviceName: "Nexus6",
    applicationName: "Nexus6"
}

结果

仅使用设备名称时,结果最奇怪。 在网格上,nexus 6被占用了。但我看到服务器我想响应nexus 5来接受这个工作,但它已经在nexus 9上执行了

当我包含applicationName时,正确的网格节点被占用(nexus 6),我认为将响应的appium服务器做出响应,但它再次在nexus 9设备上执行测试。

版本与applicationName相同。

Udid我没有尝试,因为它会像超时那样覆盖这个功能。

主要问题

如何将appium服务器节点配置为仅为一部特定手机提供服务而无需编写自定义功能匹配器?

1 个答案:

答案 0 :(得分:1)

我很惊讶我之前尝试的功能不起作用,因为在其他论坛帖子中它似乎对其他人有效(尽管通常不清楚他们是否使用硒网格)。

到目前为止我的解决方案是使用以下appium服务器(网格节点)配置(需要包含udid和版本)

{
  "capabilities":[
    {
    "platform": "ANDROID",
    "platformName": "Android",
    "platformVersion": "7.1.1",
    "browserName": "chrome",
    "version": "6",
    "deviceName": "Nexus6",
    "udid": "192.1.1.63:5555",
    "maxInstances": 1
    }
  ],
  "configuration":
    {
    "cleanUpCycle":2500,
    "timeout":30000,
    "maxSession": 1,
    "register": true,
    "registerCycle": 1000,
    "hubPort": 4444,
    "hubHost": "localhost"
    }
}

对于开始会话同样适用(包括udid和版本)

Watir::Browser.new :chrome, {
    url: "http://localhost:4444/wd/hub",  
    platformName: "Android",
    platformVersion: "7.1.1",
    browserName: "chrome",
    version: "6",
    deviceName: "Nexus6",
    udid: "192.1.1.63:5555"
}

要知道为什么我尝试的上述解决方案不起作用仍然是一件好事。从我读过的所有内容中我都认为这就是原因。 网格只查看platformName,platformVersion,browserName,version(browserVersion)和deviceName(尽管最后一个被忽略)。基于此,它将所有功能转发到匹配的appium节点。然后udid被appium节点识别为一种功能,用于建立与我想要的手机的连接。 如果我省略了udid,它将连接到与其他功能匹配的手机,并忽略我在初始配置中设置的udid。最后一点是我不明白为什么会这样,但对我来说这个设置(使用udid)有效。