Как программно настроить WebDriver в базовом классе в Selenium Jupiter?

Я хочу перенести существующие тесты Selenium на основе JUnit 4 в JUnit 5. Для этой цели я хочу использовать Selenium-Jupiter.

Одно из требований, которое должны выполнить тесты, - это возможность переключения реализации WebDriver во время выполнения - в зависимости от среды выполнения - с использованием одного общего базового класса для всех тестов:

  • При запуске на компьютере разработчика (Windows 10) следует использовать FirefoxDriver, запускающий локально установленный Firefox.
  • В CI-среде (CentOS 7) следует использовать RemoteWebDriver, делегируя выполнение теста в Selenium Grid.

Я уже пытался настроить "Универсальный WebDriver" в соответствии с документацией, но я не знаю, как этого добиться для RemoteWebDriver ("Пример 2" должен прояснить ситуацию).

Что касается контента, то эта публикация stackru довольно связана, но не дает удовлетворительного ответа.

ОБНОВЛЕНИЕ: я решил проблему самостоятельно. Смотрите "Пример 3"...


Эй, Boni García, может быть, вы хотите немного обновить документацию по Selenium Jupiter. По крайней мере, у меня были некоторые проблемы, выяснить это... о, и большое спасибо за отличную работу, которую вы проделали с Selenium Jupiter (и лежащим в основе WebDriverManger).


Пример 1. Что работает, но не элегантно

@ExtendWith(SeleniumExtension.class)
class MyTest {

  @EnabledIfSystemProperty(named = "os.name", matches = "Windows 10")
  @Test
  void test_executed_with_local_firefox(FirefoxDriver ffDriver) {
     executeTestCaseWith(ffDriver);
  }

  @EnabledIfSystemProperty(named = "os.name", matches = "Linux")
  @Test
  void test_executed_with_firefox_from_selenium_grid(@DriverUrl("http://...") RemoteWebDriver remoteDriver) {
     executeTestCaseWith(remoteDriver);
  }

  void executeTestCaseWith(WebDriver webDriver) {
     webDriver.get(...)
     Assert(...)
  }
}

Проблемы, которые я вижу хи:

  1. Довольно многословно (хотя это можно сделать с помощью пользовательских аннотаций)
  2. Каждому тестовому классу нужны два @Test-метода для одного логического / семантического теста
  3. Представлена ​​конкретная реализация WebDriver, что позволяет авторам тестов полагаться на детали реализации WebDriver (например, профили Firefox)

Пример 2: что я хотел бы сделать, но пока не работает

Базовый класс, который выполняет настройку WebDriver:

abstract class UiTest {

   @RegisterExtension
   static SeleniumExtension seleniumExtension = new SeleniumExtension();     

   @BeforeAll
   static void setUpOnce() {

     // This check is not the problem discussed here
     boolean isRunningInCiEnvironment = ...
     Browser firefox;

      if( ! isRunningInCiEnvironment ) {
        // This works
        firefox = BrowserBuilder.firefox().build();
      } else {
        // this does not exist yet!
        //firefox = BrowserBuilder.remoteWebDriver().url("http://...").build();

        // This executes, but does not behave as expected
        // The URL is pretty much ignored.
        firefox = BrowserBuilder.firefox().url("http://...").build();
      }

     seleniumExtension.addBrowsers(firefox);
   }       
}

В тесте мне тогда нужно было только сделать что-то. как это.

class MyTest extends UiTest {

  @Test
  void my_one_logic_test_case(WebDriver webDriver) {

     webDriver.get(...)
     Assert(...)        
  }
}

Обратите внимание, что тип параметра - только WebDriver!

Пример 3: Мое текущее решение

abstract class UiTest {

   @RegisterExtension
   static SeleniumExtension seleniumExtension = new SeleniumExtension();     

   @BeforeAll
   static void setUpOnce() {

     // This check is not the problem discussed here
     boolean isRunningInCiEnvironment = ...

      if( isRunningInCiEnvironment ) {
        // This is doing the trick!
        seleniumExtension.getConfig().setSeleniumServerUrl("http://...");
      }

     seleniumExtension.addBrowsers( BrowserBuilder.firefox().build() );
   }       
}

Конкретный тест теперь может быть реализован, как показано в "Примере 2".

1 ответ

Вы можете использовать и использовать конфигурацию браузера, используя два файла.

  1. Напишите свой тест, аннотированный с помощью@TestTemplate:
      class MyTest {

  @TestTemplate
  void my_logic_test_case(WebDriver webDriver) {
    // ...       
  }
}
  1. добавитьbrowsers.jsonв ваш путь к классам (по умолчанию, используйте локальную установку Firefox):
      {
  "browsers": [
    [
      {
        "type": "firefox"
      }
    ]
  ]
}
  1. добавьте a в свой путь к классам (не по умолчанию, использует Selenium Grid/RemoteWebDriver):
      {
  "browsers": [
    [
      {
        "type": "firefox",
        "capabilities": {
          "browserName": "firefox"
        },
        "arguments": [
          "--headless"
        ],
        "remoteUrl": "https://mygrid.com/wd/hub"
      }
    ]
  ]
}

Теперь вы можете запустить тест локально, и он будет использовать локальный Firefox. Если вы запускаете тесты в среде CI, настройте сценарий CI, чтобы установить системное свойствоsel.jup.browser.template.json.fileуказать наbrowsers-ci.json.

Например, если вы используете Maven для запуска тестов Selenium-Jupiter:

      mvn test -Dsel.jup.browser.template.json.file=classpath:browsers-ci.json
Другие вопросы по тегам