我想将现有的基于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”中所描述的那样实施具体的测试。
1条答案
按热度按时间33qvvth11#
您可以使用
@TestTemplate
并使用两个browsers.json
文件来利用浏览器配置。1.编写带有
@TestTemplate
注解的测试:1.在类路径中添加一个
browsers.json
(默认,使用本地Firefox安装):1.将
browsers-ci.json
添加到类路径(不是默认值,使用Selenium Grid / RemoteWebDriver):现在,您可以在本地运行测试,它将使用本地Firefox。如果您在CI环境中运行测试,请配置CI脚本以将系统属性
sel.jup.browser.template.json.file
设置为指向browsers-ci.json
。例如,如果使用Maven运行Selenium-Jupiter测试: