1

我似乎无法让 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 配置),那么一切都或多或少地开始正常工作,但是这种方法存在一个问题,即集线器就绪和黄瓜之间存在竞争条件测试尝试将 webdriver 连接到它。理想情况下,我想像我计划的那样使用 SeleniumServer。任何关于我可能做错了什么,或者我如何让它表现的建议,将不胜感激。

4

3 回答 3

1

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

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

于 2016-04-14T21:36:15.350 回答
0

使用 thread-count="10" 更新您的 testNG.xml 文件(或者您想要运行多少个实例,例如: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>
于 2016-03-21T19:39:22.810 回答
0

您在这里缺少的是,Se Grid 没有并行启动测试脚本的能力。如果您的框架(我使用 TestNG 完成)能够生成多线程,那么 Se Grid 会很高兴地使用它并为您运行它们。

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

于 2017-12-14T18:41:06.553 回答