如何根据环境使用不同的网络驱动程序

How to use different webdrivers based on environment

我使用 selenium-jupiter。我从这样的方法参数中得到一个网络驱动程序:

@Test
public void testWithChrome(ChromeDriver chromeDriver) {
          chromeDriver.get("someUrlHere");
}

现在我想运行在网格上进行测试,所以我需要根据环境使用webdriver。例如,在我的 PC 上开发测试时,我想使用(本地)ChromeDriver,但是当使用 Jenkins 在网格上进行 运行ning 测试时,我想使用 RemoteDriver。 所以我需要这样的东西:(当 env = 0 时给我本地 Chrome 或当 env = 1 时给我远程 Chrome 但它不起作用)

int env = 0;

@Test
public void testWithChrome(
   (env == 0 ? ChromeDriver driver : RemoteDriver driver)) {
          driver.get("someUrlHere");
}

我认为这里最好有一个在任何测试(用 @BeforeAll 注释)之前执行的方法来确定脚本在 运行 中的环境。它可能读取从一些配置文件本地 vs 网格。确定后,将 driver 变量指定为 ChromeDriverRemoteDriver 的实例。从那时起,您的测试将传递类型为 WebDriverdriver 实例,因为 ChromeDriverRemoteDriver 都继承自它。

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 扩展时,您可以通过如下配置其 URL 来强制使用 Selenium 网格(使用 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.(...)        
    }
}

长度问题is decribed here

您可以使用此扩展程序附带的 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();
   }