如何确保appium节点只连接到一个phone?

How to make sure the appium node is connected to only one phone?

我 运行(全部在一台机器上)多个 appium 服务器作为节点连接到 selenium-grid hub,我有多个 phones 连接到端口 5555 上的我的 adb(在我的例子中通过 WiFi)。

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

我的设置

测试设备

网格

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, version capability

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 相同。

我没有尝试过,因为它会像超时一样覆盖此功能。

主要问题

如何将 appium 服务器节点配置为仅服务于一个特定的 phone 而无需编写自定义功能匹配器?

令我感到惊讶的是,我之前尝试过的功能并没有起作用,因为在其他论坛帖子中它似乎对其他人有效(尽管通常不清楚他们是否使用了 selenium-grid)。

我目前的解决方案是使用以下appium服务器(网格节点)配置(udid和version都需要包括在内)

{
  "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节点识别为能力,用来连接到我想要的phone。 如果我省略了 udid,它将连接到与其他功能匹配的 phone,并忽略我在初始配置中设置的 udid。最后一点是我不明白为什么会这样,但对我来说这个设置(使用 udid)有效。