我似乎无法让 Selenium Grid2 遵守 maxSession 参数,无论我将其设置为命令行选项还是 JSON 配置,无论我将其设置在集线器还是节点或两者上。网格完全忽略它。在我为它打开错误票之前,我想确保我做对了。
这是一个使用selenium-server-standalone-jar和selenium-webdriver NPM 模块的 node.js 应用程序,两者都是最新的。该过程大致分解如下:
1) 启动本地运行的 selenium 网格集线器:
var jar = require("selenium-server-standalone-jar"),
hub = require("selenium-webdriver/remote").SeleniumServer(jar.path, {
loopback: true,
port: 4444,
args: [ "-role hub", "-hubConfig " + config_path ]
});
该集线器配置文件如下所示:
{
"host": null,
"port": 4444,
"newSessionWaitTimeout": -1,
"throwOnCapabilityNotPresent": true,
"nodePolling": 5000,
"cleanUpCycle": 5000,
"timeout": 300000,
"browserTimeout": 0,
"maxSession": 1
}
2)启动本地运行的selenium网格节点:
var hub = require("selenium-webdriver/remote").SeleniumServer(jar.path, {
loopback: true,
port: 5555,
args: [ "-role node", "-nodeConfig " + config_path ]
});
节点配置如下所示:
{
"capabilities": [
{
"browserName": "firefox",
"maxInstances": 1,
"seleniumProtocol": "WebDriver"
}
],
"configuration": {
"maxSession": 1,
"port": 5555,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "127.0.0.1"
}
}
所以此时我有一个以 maxSession=1 运行的集线器和一个以 maxSession=1 和 maxInstances=1 运行的节点(对于 Firefox)。这不是应用程序长期运行的方式,我只是想让 Selenium Grid 证明它可以限制会话。
3) 启动 5 个子进程,每个子进程都有自己的 webdriver 使用集线器服务器
每个都继续运行其浏览器操作,然后在终止之前关闭 webdriver。
我希望看到的是:网格应该限制这些子进程可以打开的浏览器数量。这是否会导致子进程排队等候。
我实际看到的是:打开了一系列 Firefox 窗口(在杀死它之前我让它爬升到 ~30)并开始并行运行它们的步骤,完全忽略了 maxSession 和 maxInstance 配置。
更新 2016-04-14
我已经在 SeleniumServer 类中隔离了这个问题。我提供给它的构造函数的“args”选项似乎被忽略了。这解释了我在测试运行时无法访问 localhost:4444/grid/console;独立服务器 jar 没有以“集线器”角色运行。
我已经验证,如果我使用 child_process.exec 直接运行 jar(使用它的角色和 JSON 配置),那么一切都或多或少地开始正常工作,但是这种方法存在一个问题,即集线器就绪和黄瓜之间存在竞争条件测试尝试将 webdriver 连接到它。理想情况下,我想像我计划的那样使用 SeleniumServer。任何关于我可能做错了什么,或者我如何让它表现的建议,将不胜感激。