Search code examples
javaselenium-webdrivertestngwebdrivermanager-java

Error registering drivers in multiple test threads using WebdriverManager


I use TestNG xml files to manage test queues and environment parameters. And would like to use WebdriverManager library to register drivers in the system. But whet the thread count more than 1, drivers are not registered properly. Please see below.

For instanse here is an example of tests config and driver instantiating:

Test 1:

<suite name="project">
     <test name = "Wiki search tests" verbose="1" parallel="true">
         <parameter name="browserName" value="firefox" />
         <classes>
             <class name="project.tests.WikiSearchTest"/>
         </classes>
     </test>
</suite>

Test 2:

<suite name="project">
    <test name = "Wiki authorization tests" verbose="1" parallel="true">
        <parameter name="browserName" value="chrome" />
        <classes>
            <class name="project.tests.LoginTest"/>
        </classes>
    </test>
</suite>

as you can see, both have "browserName" parameter, but different values in it. Example of driver registering in test base class:

private static final CountDownLatch latch = new CountDownLatch(1);

@Parameters({"browserName"})
@BeforeTest
public void setUp(@Optional String browserName) throws InterruptedException{
    switch (browserName) {
        case "firefox" :
            FirefoxDriverManager.getInstance().setup();
            latch.countDown();
            System.out.println(" in firefox");
            break;
        case "chrome" :
            ChromeDriverManager.getInstance().setup();
            latch.countDown();
            System.out.println(" in chrome");
            break;
    }
    latch.await();

Surefire plugin threads setting:

 <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${surefire.version}</version>

        <configuration>
              <properties>
              <property>
                   <name>suitethreadpoolsize</name>
                   <value>2</value>
              </property>

When tests run with value = 1 for suitethreadpoolsize property, all works perfectly:

Running TestSuite
[2017-04-10 11:32:45:490] [main] INFO BrowserManager - Reading https://chromedriver.storage.googleapis.com/ to seek [chromedriver]
[2017-04-10 11:32:46:172] [main] INFO BrowserManager - Latest version of [chromedriver] is 2.29
[2017-04-10 11:32:46:190] [main] INFO BrowserManager - Exporting webdriver.chrome.driver as C:\Users\bnesteruk\.m2\repository\webdriver\chromedriver\win32\2.29\chromedriver.exe
 in chrome
Starting ChromeDriver 2.29.461591 (62ebf098771772160f391d75e589dc567915b233) on port 11014


[2017-04-10 11:32:49:314] [main] INFO BrowserManager - Reading https://api.github.com/repos/mozilla/geckodriver/releases to seek [wires, geckodriver]
[2017-04-10 11:32:49:590] [main] INFO BrowserManager - Latest version of [wires, geckodriver] is 0.15.0
[2017-04-10 11:32:49:649] [main] INFO BrowserManager - Exporting webdriver.gecko.driver as C:\Users\bnesteruk\.m2\repository\webdriver\geckodriver\win64\0.15.0\geckodriver.exe
 in firefox

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.831 sec - in TestSuite

The problem:

If I set threads count more than 1 in surefire plugin,

 <property>
       <name>suitethreadpoolsize</name>
       <value>4</value>
 </property>

both .setup() methods run in parallel and seems that static instance of webdriver in BrowserManager is simply replaced by the last browser name (geckodriver in my example)

 [2017-04-10 11:38:00:726] [pool-1-thread-1] INFO BrowserManager - Reading https://api.github.com/repos/mozilla/geckodriver/releases to seek [wires, geckodriver]
[2017-04-10 11:38:00:726] [pool-1-thread-2] INFO BrowserManager - Reading https://api.github.com/repos/mozilla/geckodriver/releases to seek [wires, geckodriver]
[2017-04-10 11:38:01:301] [pool-1-thread-2] INFO BrowserManager - Latest version of [wires, geckodriver] is 0.15.0
[2017-04-10 11:38:01:301] [pool-1-thread-1] INFO BrowserManager - Latest version of [wires, geckodriver] is 0.15.0
[2017-04-10 11:38:01:361] [pool-1-thread-2] INFO BrowserManager - Exporting webdriver.gecko.driver as C:\Users\bnesteruk\.m2\repository\webdriver\geckodriver\win64\0.15.0\geckodriver.exe
[2017-04-10 11:38:01:361] [pool-1-thread-1] INFO BrowserManager - Exporting webdriver.gecko.driver as C:\Users\bnesteruk\.m2\repository\webdriver\geckodriver\win64\0.15.0\geckodriver.exe
 in chrome
 in firefox
[WARNING] [11:38:01.496] The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html

I guess, I'm using CountDownLatch in a wrong way? How can I haldle this?


Solution

  • The issue has been solved by adding simple synchronized(BrowserManager) section to driver registering section, thanks!

    synchronized (BrowserManager.class) {
                switch (browserName) {
                    case "firefox":
                        FirefoxDriverManager.getInstance().setup();
                        System.out.println("Registering    FIREFOX");
                        break;
                    case "chrome":
                        ChromeDriverManager.getInstance().setup();
                        System.out.println("Registering    CHROME");
                        break;
                }
            }
    

    Output:

    Running TestSuite
    Registering    CHROME
    [2017-04-10 12:34:51:913] [pool-1-thread-2] INFO BrowserManager - Reading https://chromedriver.storage.googleapis.com/ to seek [chromedriver]
    [2017-04-10 12:34:52:604] [pool-1-thread-2] INFO BrowserManager - Latest version of [chromedriver] is 2.29
    [2017-04-10 12:34:52:624] [pool-1-thread-2] INFO BrowserManager - Exporting webdriver.chrome.driver as C:\Users\bnesteruk\.m2\repository\webdriver\chromedriver\win32\2.29\chromedriver.exe
    Registering    FIREFOX
    [2017-04-10 12:34:53:206] [pool-1-thread-1] INFO BrowserManager - Reading https://api.github.com/repos/mozilla/geckodriver/releases to seek [wires, geckodriver]
    [2017-04-10 12:34:53:487] [pool-1-thread-1] INFO BrowserManager - Latest version of [wires, geckodriver] is 0.15.0
    [2017-04-10 12:34:53:505] [pool-1-thread-1] INFO BrowserManager - Exporting webdriver.gecko.driver as C:\Users\bnesteruk\.m2\repository\webdriver\geckodriver\win64\0.15.0\geckodriver.exe