Selenium Grid maxSession被忽略

时间:2016-02-16 18:08:30

标签: node.js selenium selenium-grid2

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

这是一个使用selenium-server-standalone-jarselenium-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配置),一切都开始正常工作,但这种方法存在问题,因为hub之间存在竞争条件准备和黄瓜测试试图将webdriver连接到它。理想情况下,我想像我计划的那样使用SeleniumServer。任何有关我可能做错的建议,或者我如何使其表现出来的建议都将不胜感激。

3 个答案:

答案 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只是一个执行者,它只会消耗你输入的内容。您需要通过框架为其创建并提供多个并行测试。