Как программно настроить 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(...)
}
}
Проблемы, которые я вижу хи:
- Довольно многословно (хотя это можно сделать с помощью пользовательских аннотаций)
- Каждому тестовому классу нужны два @Test-метода для одного логического / семантического теста
- Представлена конкретная реализация 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 ответ
Вы можете использовать и использовать конфигурацию браузера, используя два файла.
- Напишите свой тест, аннотированный с помощью
@TestTemplate
:
class MyTest {
@TestTemplate
void my_logic_test_case(WebDriver webDriver) {
// ...
}
}
- добавить
browsers.json
в ваш путь к классам (по умолчанию, используйте локальную установку Firefox):
{
"browsers": [
[
{
"type": "firefox"
}
]
]
}
- добавьте 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