Повторное использование одного и того же веб-драйвера для разных тестов, но не каждый раз его создание - PullRequest
0 голосов
/ 08 января 2020

Я делаю проект, который запускает тесты в веб-приложении с использованием Selenium Webdriver. Мне нужно иметь возможность тестировать разные браузеры в моем CI Pipeline, поэтому при выполнении набора тестов я указываю, какой браузер следует использовать.

 mvn test -Dwebdriver.gecko.driver="/webdrivers/geckodriver" -Dwebdriver.chrome.driver="/webdrivers/chromedriver" -DbrowserUnderTest="headless-firefox"

В тестах используется объект WebDriver для управления браузером, поэтому, чтобы сделать код легким в обслуживании, я сделал так, чтобы каждый класс теста наследовал от класса с именем BasicTest, где WebDriver driver объект создан.

Кроме того, чтобы ускорить выполнение теста, я сделал так, чтобы тесты повторно использовали один и тот же экземпляр браузера , поэтому, когда тест завершается, в следующем тесте используется уже открытый браузер , Вот почему в коде BasicTest мои WebDriver объекты определены как public static:

    public static FirefoxOptions ff_opt_headless = new FirefoxOptions().setHeadless(true);
    public static ChromeOptions chrome_opt_headless = new ChromeOptions().addArguments("--headless");

    public static WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
    public static WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);

    public static WebDriver driver; 

    public BasicTest() throws Exception {
        String browserUnderTest = System.getProperty("browserUnderTest");
        switch (browserUnderTest) {
        case "headless-firefox":
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            driver = chrome_driver_headless;
            break;
        }
    }

Проблема, с которой я здесь сталкиваюсь, заключается в том, что firefox_driver_headless и chrome_driver_headless создаются каждый раз время, что означает, что даже если я укажу Firefox для набора тестов, Chrome также будет открываться бесполезно. Поэтому мне нужно найти способ не создавать экземпляры объектов firefox_driver_headless и chrome_driver_headless при создании BasicTest.

Если я продолжу в том же духе, то при добавлении драйверов для браузеров, которые могут быть недоступны на каждой платформе могут быть запущены мои тесты, у меня будут проблемы. (например: если мои тесты выполняются на Linux, и я пытаюсь создать экземпляр объекта internet_explorer_webdriver, он не будет выполнен.)

Я уже пытался создать их экземпляр в случае переключения, как показано ниже:

public static WebDriver driver;
switch (browserUnderTest) {
        case "headless-firefox":
            WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);
            driver = chrome_driver_headless;
            break;
        }

Хотя это не открывает Chrome, когда я запускаю свой тест, он также открывает Firefox для каждого теста, что не то, что я хочу: Я хочу, чтобы один и тот же экземпляр браузера был повторно используется для каждого теста .

Так в чем здесь решение? Должен ли я просто отказаться от попыток сделать так, чтобы один и тот же экземпляр браузера использовался для каждого теста? Я предполагал, что TestSuite будет следовать логическому порядку, как обычный человек. (ie, чтобы проверить функцию «изменить аватар», будет выполнен тест Login, затем будет выполнен тест AccessProfile, а затем ChangeAvatar ... )

1 Ответ

2 голосов
/ 08 января 2020

Переместите логи коммутатора c в stati c блок инициализации , чтобы он выполнялся только один раз при загрузке класса BasicTest

static {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...