如何在Selenium Jupiter的基类中以编程方式配置WebDriver?

时间:2019-02-11 13:58:02

标签: java selenium-webdriver junit selenium-jupiter

我想将基于JUnit 4的现有Selenium-Test迁移到JUnit5。为此,我想使用Selenium-Jupiter

测试必须满足的一个要求是,能够基于运行环境在运行时切换WebDriver实现-对所有测试使用一个通用基类 strong>:

  • 在开发人员计算机(Windows 10)上执行时,应使用FirefoxDriver,启动本地安装的Firefox。
  • 在CI环境(CentOS 7)中,应使用RemoteWebDriver,将测试执行委托给Selenium Grid

我已经尝试配置“通用WebDriver” according to documentation,但是我不知道如何为RemoteWebDriver实现这一点(“示例2”应该使事情更清楚)。

关于内容this stackoverflow-posting is quite related,但未给出令人满意的答案。

更新:我自己解决了这个问题。请参阅“示例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(...)
  }
}

我看到的问题是:

  1. 非常冗长(可以通过自定义注释进行操作)
  2. 每个测试类需要两个逻辑/语义测试用例的方法
  3. 公开了具体的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);
   }       
}

然后在测试中,我只需要做某事。这样。

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”中的说明实施具体测试。

0 个答案:

没有答案