Selenium Grid并行测试时如何让hub决定执行哪个节点?

How to let the hub decide which node to execute during the parallel testing of the Selenium Grid?

我正在 3 台不同的机器 A、B 和 C 上使用 Selenium Grid 对我的 GWT Web 应用程序执行跨浏览器测试(使用 TestNG)。机器 A 作为集线器和节点工作。而另外两台机器B和C被赋予了节点的角色。

现在,摆在我面前的任务是让集线器自己决定三个节点中的哪个节点可用,然后它会在这些特定节点上执行测试。例如:如果机器 B 已关闭或当前未工作,则集线器将不会执行它,并将继续使用机器 A 和 C 进行测试。

此外,另一个任务是不更改每个特定节点的代码,因为这是我根据我在 Selenium Grid 中的一点知识和经验在这里做的事情。下面提到的是我在启动集线器以及所有这些机器上的节点后编写的代码。

package testNgPackage;

public class Browser {
    //ThreadLocal will provide thread-safe tests
    protected ThreadLocal<RemoteWebDriver> threadLocal = null;
    @BeforeTest
    @Parameters("browser")
    public void setup(String browser) throws MalformedURLException{
        String nodeMachine1 = "http://xxx/wd/hub";
        String nodeMachine2 = "http://yyy/wd/hub";
        String nodeMachine3 = "http://zzz/wd/hub";
        if(browser.equalsIgnoreCase("chrome")) {

            System.setProperty("webdriver.chrome.driver", ".src/Drivers/chromedriver.exe");
            DesiredCapabilities capability = null;
            capability = DesiredCapabilities.chrome();
            capability.setPlatform(Platform.VISTA);
            capability.setBrowserName("chrome");
            threadLocal = new ThreadLocal<RemoteWebDriver>();
            threadLocal.set(new RemoteWebDriver(new URL(nodeMachine1), capability));
        }
        else if(browser.equalsIgnoreCase("firefox")) {

            System.setProperty("webdriver.gecko.driver", ".src/Drivers/geckodriver.exe");
            DesiredCapabilities capability = null;
            capability = DesiredCapabilities.firefox();
            capability.setPlatform(Platform.WIN10);
            capability.setBrowserName("firefox");
            threadLocal = new ThreadLocal<RemoteWebDriver>();
            threadLocal.set(new RemoteWebDriver(new URL(nodeMachine2), capability));
        }

    }

    public WebDriver getDriver() {
        return threadLocal.get();
    }


    @AfterTest
    public void closeBrowser(){
        getDriver().close();
    }

}

要对其执行测试的代码扩展了此浏览器class,但编写该代码在这里没有用。下面还提到了 testng.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
 <suite name="Parallel test suite" parallel="tests" thread-count="2">
    <test name="FirefoxTest">
       <parameter name="browser" value="Firefox" />
       <classes>
         <class name="testNgPackage.TestNGClass"/>
       </classes>
    </test>
    <test name="ChromeTest">
       <parameter name="browser" value="Chrome" />
       <classes>
         <class name="testNgPackage.TestNGClass"/>
       </classes>
    </test>
</suite>

我应该怎么做才能优化我的代码并完成任务?

当您使用 selenium 网格启动浏览器时,您必须像 http://hubIP:hubPort/wd/hub 一样通过网格中心 URL。无需通过所有节点机器URLS.

所以请替换行,

String nodeMachine1 = "http://xxx/wd/hub";

与集线器URL如下,

String hubMachine = "http://hubIP:hubPort/wd/hub";

例如,集线器 URL 应该是 http://xx.xx.xx.xx:4444/wd/hub。默认情况下,selenium 网格将使用端口 4444 启动。

并替换行

threadLocal.set(new RemoteWebDriver(new URL(nodeMachine1), capability));

threadLocal.set(new RemoteWebDriver(new URL(hubMachine ), capability));

此外,请确保您已启动集线器并正确注册节点。

您无需在代码中设置驱动程序 属性 并在将节点注册到集线器时传递它

>java -Dwebdriver.chrome.driver=<path to driver> -jar <jarname> -role node -hub <hubURL>