我有一个基于serenity-bdd/serenity-cucumber-starter项目的项目。我正在使用test-containers启动几个Docker容器以及一个Selenium Grid
容器来运行测试。
new GenericContainer<>(SELENIUM_IMAGE)
...
.withExposedPorts(SELENIUM_CONTAINER_PORT, SELENIUM_CONTAINER_NOVNC_PORT)
...
);
测试开始时,test-containers
将加速容器并将随机主机端口绑定到容器的所有暴露端口。
因此,我无法在serenity.conf
中为远程驱动程序的URL定义一个固定值
webdriver.remote.url = "http://localhost:????/wd/hub"
因此,我需要一种以编程方式设置webdriver.remote.url
的方法。
一种选择是使用FixedHostPortGenericContainer
,它允许您定义绑定容器暴露端口的主机端口。
我还是想使用一种不同的方法,因为开发人员指出
尽管这可行,但我们强烈建议不要使用固定端口,因为这将自动导致集成测试(这是一种反模式)。
所以问题是:如何在运行时修改webdriver.remote.url
的值? serenity-bdd
是否提供任何选项来在运行时重新加载net.thucydides.core.util.SystemEnvironmentVariables
?
答案 0 :(得分:1)
最近遇到了同样的问题,但很幸运找到了解决方案:
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import net.serenitybdd.core.webdriver.driverproviders.FirefoxDriverCapabilities;
import net.thucydides.core.guice.Injectors;
import net.thucydides.core.util.EnvironmentVariables;
import net.thucydides.core.webdriver.DriverSource;
public class CustomWebDriverFactory implements DriverSource {
@Override
public WebDriver newDriver() {
try {
String ip = "your_dynamic_ip";
return new RemoteWebDriver(
new URL("http://" + ip + ":4444/wd/hub"),
new FirefoxDriverCapabilities(Injectors.getInjector().getProvider(EnvironmentVariables.class).get()).getCapabilities());
}
catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean takesScreenshots() {
return true;
}
}
因此,您必须添加此类工厂实现并在 serenity.properties 中定义:
webdriver.driver = provided
webdriver.provided.type = mydriver
webdriver.provided.mydriver = <your_factory_package>.CustomWebDriverFactory
thucydides.driver.capabilities = mydriver