Как использовать разные веб-драйверы в зависимости от среды

Я использую селен-Юпитер. Я получаю веб-драйвер из аргументов метода, как это:

@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();
   }
Другие вопросы по тегам