Selenium Grid maxSession 被忽略

Selenium Grid maxSession ignored

我似乎无法让 Selenium Grid2 遵守 maxSession 参数,无论我是将它设置为命令行选项还是在 JSON 配置中,无论我是在集线器上还是在节点或两者。网格完全忽略它。在我为它打开错误票之前,我想确保我做的是正确的。

这是一个使用 selenium-server-standalone-jar and selenium-webdriver NPM 模块的 node.js 应用程序,两者都是最新的。大致分解过程如下:

1) 在本地启动 selenium grid hub 运行ning:

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 网格节点 运行ning:

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 使用中心服务器

每个都通过其浏览器操作进行到 运行,然后在终止之前关闭网络驱动程序。

我希望看到的内容: 网格应该限制这些子进程可以打开的浏览器数量。这是否会导致子进程排队等候。

我实际看到的是:连续打开firefox windows(我让它爬到~30才杀掉)然后启动运行并行完成他们的步骤,完全忽略 maxSession 和 maxInstance 配置。

更新 2016-04-14

我已经在 SeleniumServer class 中隔离了这个问题。似乎我提供给它的构造函数的 "args" 选项被忽略了。这解释了我在测试 运行ning 时无法达到 localhost:4444/grid/console;独立服务器 jar 不是 运行 "hub" 角色。

我已经证实,如果我直接使用 child_process.exec 到 运行 罐子(及其角色和 JSON 配置),一切都会或多或少地开始正常工作,但是有一个这种方法的问题在于集线器准备就绪和黄瓜测试尝试将网络驱动程序连接到它之间存在竞争条件。理想情况下,我想像我计划的那样使用 SeleniumServer。任何关于我可能做错了什么,或者我如何让它表现的建议,将不胜感激。

更新您的 testNG.xml 文件,将线程数设置为“10” (或者你想要多少个实例 运行 例如:2、3、4 等)

我使用 testNG 来 运行 我的并行测试。 @Factory 和@DataProvider 以编程方式生成我的测试。我 运行 遇到了同样的问题。在尝试了各种解决方法后,我用 thread-count="10" 更新了我的 testng.xml 文件并且它起作用了。

我仍然无法让它与用作集线器配置的 .JSON 文件设置同步,但它确实帮助我实现了我的目标。这是我完整的 testNG.xml 文件(我使用 parallel="methods" 因为这就是 @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>

事实证明这只是我构建 args 数组的方式有问题。它期望参数名称和值是单独的项目,因此 [ "-role hub", "-hubConfig " + config_path ] 不起作用,但 [ "-role", "hub", "-hubConfig", config_path ] 可能起作用。

我说可能是因为现在我遇到了一个新问题,集线器 start() 在 30 秒后超时,但至少我可以在这 30 秒内加载 grid/console 并查看配置是否正确.感谢@djangofan 和@nash 的帮助。

您在这里缺少的是,Se Grid 不具备并行启动测试脚本的能力。如果您的框架(我使用 TestNG 做到了)能够生成多线程,那么 Se Grid 将很乐意使用它并 运行 它们为您服务。

Se Grid 只是一个执行器,它只是消耗你输入的内容。您需要通过您的框架创建并提供多个并行测试。