【问题标题】:How to use different webdrivers based on environment如何根据环境使用不同的 webdrivers
【发布时间】:2018-11-24 06:04:44
【问题描述】:

我使用 selenium-jupiter。我从这样的方法参数中得到一个 webdriver:

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

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

int env = 0;

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

【问题讨论】:

  • 你查看过官方文档的配置选项吗? bonigarcia.github.io/selenium-jupiter
  • 不,但我现在正在检查它,看起来,我可以调整 WebDriverManager 以实现我想要的。

标签: selenium-webdriver selenium-grid junit5 junit-jupiter selenium-jupiter


【解决方案1】:

我认为这里更好的是有一个在任何测试之前执行的方法(用@BeforeAll 注释)来确定脚本正在运行的环境。它可能从一些配置文件中读取本地与网格。确定后,将driver 变量分配为ChromeDriverRemoteDriver 的实例。从那时起,您的测试将绕过driver 实例,该实例的类型为WebDriver,因为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-jupiter 中做到这一点?
  • 不知道。我在今天之前没听说过。传递一个特定的驱动程序并为特定的浏览器编写测试对我来说似乎很奇怪。这有点违背了编写一次测试并在 X 浏览器上运行它的整个目的。我会在 github 网站上提交问题,也许那里的人可以帮助你。也许有一些教程或示例代码可以参考。
  • 我找到了一个与您要查找的内容有些相似的示例。它位于Quick reference section 的底部,以You can also inject WebDriver objects declaring them as constructor parameters, instead of as test method parameters. 开头,代码如下。
  • 在构造函数中注入 WebDriver 似乎与在方法中注入相同。
  • 看来我会使用你的解决方案,我暂时不会使用 selenium-jupiter。
【解决方案2】:

简而言之:以编程方式配置 Selenium 扩展时,您可以通过如下配置其 URL(使用 JUnit 5 注释)来强制使用 Selenium Grid:

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

【讨论】:

  • 非常感谢。还没试过,但似乎是最好的答案。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-08-30
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多