4

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

测试必须满足的一项要求是,能够在运行时切换 WebDriver 实现- 基于执行环境 -为所有测试使用一个公共基类

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

我已经尝试根据文档配置“通用 WebDriver” ,但我不知道如何为 RemoteWebDriver 实现这一点(“示例 2”应该让事情更清楚)。

关于内容,这个 stackoverflow-posting 非常相关,但没有产生令人满意的答案。

更新:我自己解决了这个问题。请参阅“示例 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. 每个测试类需要两个@Test-methods 用于一个逻辑/语义测试用例
  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”中的描述来实施具体测试。

4

0 回答 0