我想将基于 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(...)
}
}
我看到的问题是:
- 相当冗长(尽管这可能通过自定义注释来处理)
- 每个测试类需要两个@Test-methods 用于一个逻辑/语义测试用例
- 公开了具体的 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”中的描述来实施具体测试。