我无法让Selenium Grid2遵守maxSession参数,无论我将其设置为命令行选项还是JSON配置,无论我是在集线器或节点上设置还是两者都设置它。网格完全忽略它。在我为它打开一张错误票之前,我想确保我做对了。
这是一个使用selenium-server-standalone-jar和selenium-webdriver NPM模块的node.js应用程序,这两个模块都是最新的。这个过程大致如下:
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
}
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证明它可以限制会话。
每个都继续执行其浏览器操作,然后在终止之前关闭webdriver。
我希望看到的内容:网格应该限制这些子进程可以打开的浏览器数量。是否应该导致子进程轮流排队。
我实际看到的内容:一系列firefox窗口打开(我让它爬到~30之前杀死它)并开始并行执行它们的步骤,完全忽略了maxSession和maxInstance配置。
我在SeleniumServer类中已经解决了这个问题。看来我向其构造函数提供的“args”选项被忽略了。这解释了我无法在测试运行时访问localhost:4444 / grid / console;独立服务器jar未以“集线器”角色运行。
我已经验证过,如果我使用child_process.exec直接运行jar(使用其角色和JSON配置),一切都开始正常工作,但这种方法存在问题,因为hub之间存在竞争条件准备和黄瓜测试试图将webdriver连接到它。理想情况下,我想像我计划的那样使用SeleniumServer。任何有关我可能做错的建议,或者我如何使其表现出来的建议都将不胜感激。
答案 0 :(得分:1)
事实证明,这只是我构建args数组的方式的一个问题。它希望参数名称和值是单独的项目,因此[ "-role hub", "-hubConfig " + config_path ]
不起作用,但[ "-role", "hub", "-hubConfig", config_path ]
可能会起作用。
我说可能是因为现在我有一个新问题,其中hub start()在30秒后超时,但至少我可以在30秒内加载网格/控制台并看到配置是正确的。感谢@djangofan和@nash的帮助。
答案 1 :(得分:0)
使用thread-count =" 10"更新testNG.xml文件 (或者你想要运行多少实例Ex:2,3,4等)
我使用testNG并行运行我的测试。 @Factory和@DataProvider以编程方式生成我的测试。我遇到了同样的问题。在尝试了各种变通方法之后,我使用thread-count =" 10"更新了我的testng.xml文件。它起作用了。
我仍然无法将其与用作集线器配置的.JSON文件设置同步,但它确实帮助我实现了我的目标。这是我的完整testNG.xml文件(我做并行="方法"因为@Factory的工作原理)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="SuiteMain" parallel="methods" thread-count="10">
<test name="maintest">
<classes>
<class name="test.java.MainDriverScript"></class>
</classes>
</test>
</suite>
答案 2 :(得分:0)
这里缺少的是,Se Grid无法并行启动测试脚本。如果你是框架(我使用TestNG做的)能够生成多线程,那么Se Grid将很乐意使用它并为你运行它们。
Se Grid只是一个执行者,它只会消耗你输入的内容。您需要通过框架为其创建并提供多个并行测试。