Как использовать разные веб-драйверы в зависимости от среды
Я использую селен-Юпитер. Я получаю веб-драйвер из аргументов метода, как это:
@Test
public void testWithChrome(ChromeDriver chromeDriver) {
chromeDriver.get("someUrlHere");
}
Теперь я хочу запустить тесты на сетке, поэтому мне нужно использовать веб-драйвер на основе среды. Например, при разработке тестов на моем ПК я хочу использовать (локальный) ChromeDriver, но при запуске тестов на сетке с Jenkins я хочу использовать RemoteDriver. Поэтому мне нужно что-то вроде этого: (Это дает мне локальный Chrome, когда env = 0, или дает мне удаленный Chrome, когда env = 1, но он не работает)
int env = 0;
@Test
public void testWithChrome(
(env == 0 ? ChromeDriver driver : RemoteDriver driver)) {
driver.get("someUrlHere");
}
1 ответ
Я думаю, что здесь было бы лучше иметь метод, который выполняется перед любым тестом (аннотированный @BeforeAll
), который определяет, в какой среде выполняется скрипт. Вероятно, он считывает данные из локального конфигурационного файла в сравнении с сеткой. Как только это будет определено, назначьте driver
переменная либо экземпляр ChromeDriver
или же RemoteDriver
, С этого момента ваши тесты будут проходить driver
экземпляр, который будет иметь тип WebDriver
потому что оба ChromeDriver
а также RemoteDriver
наследовать от него.
WebDriver driver;
@BeforeAll
public void setup()
{
// read from config file, etc. to determine if local or grid
if (local)
{
driver = new ChromeDriver();
}
else
{
driver = new RemoteDriver();
}
}
@Test
public void test()
{
driver.get("someUrlHere");
}
Вкратце: при программной настройке расширения Selenium вы можете принудительно использовать Selenium Grid, настроив его URL следующим образом (используя аннотации JUnit 5):
abstract class UiTest {
@RegisterExtension
static SeleniumExtension seleniumExtension = new SeleniumExtension();
@BeforeAll
static void setUpOnce() {
boolean isRunningInCiEnvironment = ...
if( isRunningInCiEnvironment ) {
// this will force Selenium Jupiter to use a RemoteWebDriver
seleniumExtension.getConfig().setSeleniumServerUrl("http://...");
}
// without above condition, a FirefoxDriver will be used locally
seleniumExtension.addBrowsers(BrowserBuilder.firefox().build(););
}
}
class MyTest extends UiTest {
// Use WebDriver interface in test method: concrete browser detected
// at execution time (via @BeforeAll, inherited from parent class)
@Test
void my_test_Case(WebDriver webDriver) {
webDriver.get(...)
Assert.(...)
}
}
Проблема в длине описана здесь.
Вы можете сделать это с WebDriverManager, который поставляется с этим расширением.
@BeforeEach
public void setUp()
{
switch(browser)
{
case "chrome" ->
{
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
case "firefox" ->
{
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
}
case "edge" ->
{
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
}
}
driver.manage().window().maximize();
}