Я хочу перенести существующие тесты Selenium на основе JUnit 4 в JUnit 5. Для этой цели я хочу использовать Selenium-Jupiter .
Одно требование:тесты должны выполнить, чтобы иметь возможность переключать реализацию WebDriver во время выполнения - в зависимости от среды выполнения - используя один общий базовый класс для всех тестов :
- При выполнении на компьютере разработчика (Windows 10) следует использовать FirefoxDriver, запуская локально установленный Firefox.
- В среде CI (CentOS 7) следует использовать RemoteWebDriver, делегируя выполнение тестак сетке Selenium
Я уже пытался настроить «Универсальный WebDriver» в соответствии с документацией , но я не знаю, как этого добиться для RemoteWebDriver («Пример 2»)."должно прояснить ситуацию).
Что касается контента , то эта публикация stackoverflow довольно связана , но не дает удовлетворительного ответа.
ОБНОВЛЕНИЕ: Я решил проблему самостоятельно.Смотрите "Пример 3" ...
Привет Boni , может быть, вы хотите немного обновить документацию по 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(...)
}
}
Проблемы, которые я вижу хи:
- Довольно многословно (tho 'это может быть выполнено с помощью пользовательских аннотаций)
- Для каждого класса тестирования требуется два @ метода тестирования для одного логического / семантического теста
- КонкретныйПредоставляется реализация 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);
}
}
В этом тесте мне нужно будет только выполнить sth.вот так.
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».