在 Selenium 网格中的特定节点上强制自动化
Force automation on particular node in Selenium grid
我们在办公环境中设置了一个用于 Web 自动化的 Selenium 网格,并且出于某些测试目的,在某些情况下,用户可能希望强制自动化发生在 Chrome 浏览器上的节点 3 上4 个活动节点。稍后,用户可以决定改天在节点 2 上强制执行 Chrome 自动化。
有没有办法强制发生这种情况?我正在研究 nodeconfig.json 文件格式,但我一直无法找到可以帮助我为节点提供唯一标识的参数。
这很有可能。这是您的操作方法。
首先,您需要通过节点配置向节点添加标签。
有关此节点配置的模板,您可以参考 selenium 代码库中的模板 here
所以这是一个包含标签的示例节点配置文件:
{
"capabilities": [
{
"browserName": "chrome",
"applicationName":"hercules",
"maxInstances": 10,
"seleniumProtocol": "WebDriver"
}
],
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"maxSession": 10
}
所以这里我们在 chrome 浏览器中添加一个标签,并将其称为 "hercules"。这可以是任何东西,但密钥必须始终是 applicationName
现在你通过命令行传入这个节点配置文件来启动一个节点-nodeConfig
。有关此的更多详细信息,请参阅我的网格教程 here
您现在可以实例化您的 RemoteWebDriver 实例,如下所示:
DesiredCapabilities caps = DesiredCapabilities.chrome();
String whichNode = System.getProperty("nodeName", "");
if (!whichNode.trim().isEmpty()) {
caps.setCapability("applicationName", whichNode);
}
RemoteWebDriver driver = new RemoteWebDriver(gridUrl, caps);
如您所见,如果您通过 JVM 参数 -DnodeName
指定了某些内容,我们将设置相同的键,即 applicationName
并传入一个值。如果您没有通过任何测试,测试将使用默认逻辑进行路由。如果您传入应用程序名称,那么它会被路由到与应用程序名称匹配的节点。
以上内容不需要您更改 selenium 网格中的任何内容,您可以按原样使用所有内容。
但是如果您想要更复杂的东西,那么您可以通过构建您自己的自定义功能匹配器来实现,您将在中心端注入它,然后在客户端使用适当的功能(如上面的示例代码)。
我创建了一个关于这件事的详细博客 post。详情可以参考here
我们在办公环境中设置了一个用于 Web 自动化的 Selenium 网格,并且出于某些测试目的,在某些情况下,用户可能希望强制自动化发生在 Chrome 浏览器上的节点 3 上4 个活动节点。稍后,用户可以决定改天在节点 2 上强制执行 Chrome 自动化。
有没有办法强制发生这种情况?我正在研究 nodeconfig.json 文件格式,但我一直无法找到可以帮助我为节点提供唯一标识的参数。
这很有可能。这是您的操作方法。
首先,您需要通过节点配置向节点添加标签。
有关此节点配置的模板,您可以参考 selenium 代码库中的模板 here
所以这是一个包含标签的示例节点配置文件:
{
"capabilities": [
{
"browserName": "chrome",
"applicationName":"hercules",
"maxInstances": 10,
"seleniumProtocol": "WebDriver"
}
],
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"maxSession": 10
}
所以这里我们在 chrome 浏览器中添加一个标签,并将其称为 "hercules"。这可以是任何东西,但密钥必须始终是 applicationName
现在你通过命令行传入这个节点配置文件来启动一个节点-nodeConfig
。有关此的更多详细信息,请参阅我的网格教程 here
您现在可以实例化您的 RemoteWebDriver 实例,如下所示:
DesiredCapabilities caps = DesiredCapabilities.chrome();
String whichNode = System.getProperty("nodeName", "");
if (!whichNode.trim().isEmpty()) {
caps.setCapability("applicationName", whichNode);
}
RemoteWebDriver driver = new RemoteWebDriver(gridUrl, caps);
如您所见,如果您通过 JVM 参数 -DnodeName
指定了某些内容,我们将设置相同的键,即 applicationName
并传入一个值。如果您没有通过任何测试,测试将使用默认逻辑进行路由。如果您传入应用程序名称,那么它会被路由到与应用程序名称匹配的节点。
以上内容不需要您更改 selenium 网格中的任何内容,您可以按原样使用所有内容。
但是如果您想要更复杂的东西,那么您可以通过构建您自己的自定义功能匹配器来实现,您将在中心端注入它,然后在客户端使用适当的功能(如上面的示例代码)。
我创建了一个关于这件事的详细博客 post。详情可以参考here