Ошибка регистрации драйверов в нескольких тестовых потоках с использованием WebdriverManager

Я использую TestNG XML-файлы для управления очередями тестирования и параметрами среды. И хотел бы использовать библиотеку WebdriverManager для регистрации драйверов в системе. Но если количество потоков больше 1, драйверы не зарегистрированы должным образом. Пожалуйста, смотрите ниже.

Для примера вот пример конфигурации тестов и создания драйвера:

Тест 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>

Тест 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>

как видите, оба имеют параметр browserName, но в нем разные значения. Пример регистрации драйвера в тестовом базовом классе:

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>
        <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>

Когда тесты выполняются со значением = 1 для свойства suitethreadpoolsize, все работает отлично:

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

Эта проблема:

Если я установлю количество потоков больше, чем 1 в верном плагине,

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

оба метода.setup() работают параллельно, и кажется, что статический экземпляр webdriver в BrowserManager просто заменяется последним именем браузера (geckodriver в моем примере)

 [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

Я думаю, я использую CountDownLatch неправильно? Как я могу обмануть это?

2 ответа

Эта проблема была решена путем добавления простого синхронизированного (BrowserManager) раздела в раздел регистрации драйверов, спасибо!

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;
            }
        }

Выход:

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

Вы можете использовать Java CountDownLatch ждать пока WebDriverManager работает. Примерно так (конечно, адаптированный под ваш код):

// Latch declaration (maybe as a class field)
CountDownLatch latch = new CountDownLatch(1);

// Somewhere in your code, you call to WebDriverManabger
ChromeDriverManager.getInstance().setup();
latch.countDown();

// In some other place in your code, you instantiate a WebDriver object
latch.await();
WebDriver chrome = new ChromeDriver();
Другие вопросы по тегам