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

lmyy7pcs  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(92)

我想将现有的基于JUnit 4的Selenium-Tests迁移到JUnit 5。为此,我想使用Selenium-Jupiter
测试必须满足的一个要求是,能够 * 在运行时切换WebDriver实现 * -基于执行环境-使用一个用于所有测试的公共基类

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

我已经尝试根据文档配置一个“Generic WebDriver”,但是我不知道如何为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.相当冗长(虽然这可能是可处理的自定义注解)
1.每个测试类需要两个@测试方法用于 * 一个 * 逻辑/语义测试用例
1.具体的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”中所描述的那样实施具体的测试。

33qvvth1

33qvvth11#

您可以使用@TestTemplate并使用两个browsers.json文件来利用浏览器配置。
1.编写带有@TestTemplate注解的测试:

class MyTest {

  @TestTemplate
  void my_logic_test_case(WebDriver webDriver) {
    // ...       
  }
}

1.在类路径中添加一个browsers.json(默认,使用本地Firefox安装):

{
  "browsers": [
    [
      {
        "type": "firefox"
      }
    ]
  ]
}

1.将browsers-ci.json添加到类路径(不是默认值,使用Selenium Grid / RemoteWebDriver):

{
  "browsers": [
    [
      {
        "type": "firefox",
        "capabilities": {
          "browserName": "firefox"
        },
        "arguments": [
          "--headless"
        ],
        "remoteUrl": "https://mygrid.com/wd/hub"
      }
    ]
  ]
}

现在,您可以在本地运行测试,它将使用本地Firefox。如果您在CI环境中运行测试,请配置CI脚本以将系统属性sel.jup.browser.template.json.file设置为指向browsers-ci.json
例如,如果使用Maven运行Selenium-Jupiter测试:

mvn test -Dsel.jup.browser.template.json.file=classpath:browsers-ci.json

相关问题