Я делаю проект, который запускает тесты в веб-приложении с использованием 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
... )