运行 使用 Remote Driver + Selenium Grid 进行并行测试

Running parallel tests with RemoteDriver + SeleniumGrid

我在做什么

我正在尝试 运行 并行 java selenium-webdriver 测试与集成在 selenium-server-standalone-2.47.1.jar 中的 Selenium-Grid。我打算 运行 多个 firefox 实例同时执行不同的情况。顺便说一句,我不会使用 TesgNG 或 JUnit。

我做了什么

为了方便大家,我将只提供一部分代码。

我这里有一个 Firefox 解析器。

public class FirefoxResolver implements Resolver{
    WebDriver driver;

    @Override
        public void connectHub() {
            DesiredCapabilities dc = DesiredCapabilities.firefox();

            dc.setBrowserName("firefox");

            dc.setPlatform(Platform.WINDOWS);


            try {
                URL url = new URL(BrowserFactory.HUB); //Here I am sure I connect to a correct hub

                driver = new RemoteWebDriver(url, dc);
            } catch(ANYEXCEPTION HERE) {

            }

    @Override
    public WebDriver getDriver() {

        return driver;
    }
}

这里我有一个 Main 运行nable

public class MainRunner implements Runnable{
    @Override
    public void run() {
    Resolver r = BrowserFactory.getInstance().getBrowserResolver(
                        browser);

                r.connectHub();

                driver = r.getDriver();
     /************************************************
     Use driver to do something then.
     /************************************************

     **Finally here I use a driver.quit() to shutdown the driver created in current thread. I have also tried driver.close()**

    }
    }

一旦触发,我的主处理器将启动一个新线程到 运行 Main运行ner。我调试了一下,发现实际上生成了不同的实例'driver'。

我也做了研究:

当您想执行以下一项或两项操作时,您应该使用 Selenium Grid:

运行 您同时针对不同的浏览器、操作系统和机器进行测试。这将确保您正在测试的应用程序与广泛的 运行ge 浏览器-O.S 组合完全兼容。

节省执行测试套件的时间。如果您将 Selenium Grid 设置为 运行,比如说,一次 4 个测试,那么您完成整个套件的速度将提高大约 4 倍。

问题

当我 运行 两个案例同时使用 firefox 时,它们似乎共享同一个会话并相互交互。我是否将节点部署在不同的机器上。这两种情况都不会成功。好像其中一个case执行完调用了driver.quit()或者driver.close(),另一个就无法继续执行了。这是堆栈跟踪信息,如果我使用 driver.close():

Exception in thread "Thread-26" org.openqa.selenium.WebDriverException: Error communicating with the remote browser. It may have died.

Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16' System info: host: 'J.Lyu', ip: '192.168.6.71', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21'

Driver info: driver.version: EventFiringWebDriver

Command duration or timeout: 1.51 seconds

Build info: version: '2.47.1', revision: 'unknown', time: '2015-07-30 11:02:44' System info: host: 'J.Lyu', ip: '192.168.6.71', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Session ID: 2b73c6e8-f601-4259-9646-9a53241fe074 Driver info: org.openqa.selenium.remote.RemoteWebDriver Capabilities [{platform=WINDOWS, javascriptEnabled=true, acceptSslCerts=true, browserName=firefox, rotatable=false, locationContextEnabled=true, webdriver.remote.sessionid=2b73c6e8-f601-4259-9646-9a53241fe074, version=40.0.3, databaseEnabled=true, cssSelectorsEnabled=true, handlesAlerts=true, webStorageEnabled=true, nativeEvents=false, applicationCacheEnabled=true, takesScreenshot=true}]

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)

at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:618) at org.openqa.selenium.remote.RemoteWebDriver.close(RemoteWebDriver.java:459) at com.milanoo.qa.runtime.module.MainRunner.run(MainRunner.java:167) at java.lang.Thread.run(Thread.java:722)

Caused by: org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died. Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16' System info: host: 'J.Lyu', ip: '192.168.6.71', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Driver info: driver.version: EventFiringWebDriver Build info: version: '2.47.1', revision: 'unknown', time: '2015-07-30 11:02:44' System info: host: 'J.Lyu', ip: '192.168.6.71', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Driver info: driver.version: unknown

任何人都可以帮忙吗?非常感谢,如果您想了解更多信息,请告诉我。

更新 2015/10/12 11:51

我试过,即使不使用任何关机命令(quit close or dispose),问题依然存在。

我检查了集线器的日志消息然后发现后面执行的总是成功而前面的总是失败(无论我只启动一个节点还是两个节点以及它们是否在不同的机器上(VM 或 RM )).似乎与较早的相关的东西被较晚开始的覆盖了。但到目前为止它还没有输出任何异常。之前的刚刚被屏蔽了。

伙计们,我终于明白了。我正在使用 Spring 提供的 @Autowired 来标记我的 Runnable(MainRunner)。根据我的研究,@Autowired 注释的 class 是一个单例。都是我的错,谢谢大家的关注。