如何让集线器决定在Selenium Grid的并行测试期间执行哪个节点?

时间:2017-09-25 12:47:08

标签: java selenium selenium-webdriver selenium-grid remotewebdriver

我正在使用Selenium Grid在3台不同的机器A,B和C上执行我的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();
    }

}

要执行测试的代码扩展了此Browser类,但在此处编写该代码是没有用的。下面还提到了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>

如何优化代码并完成任务?

1 个答案:

答案 0 :(得分:1)

使用selenium网格启动浏览器时,必须传递http://hubIP:hubPort/wd/hub之类的网格中心网址。无需传递所有节点机器URL。

所以请更换一行,

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

中心网址如下,

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

中心网址应为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>