运行时修改远程驱动URL
Modify remote driver URL at runtime
我有一个基于 serenity-bdd/serenity-cucumber-starter project. I'm using 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
,它允许您定义容器公开端口将绑定到的主机端口。
我宁愿使用不同的方法,正如开发人员所说
While this works, we strongly advise against using fixed ports, since this will automatically lead to integrated tests (which are an anti pattern).
那么问题来了:如何在运行时修改webdriver.remote.url
的值呢? serenity-bdd
是否提供了在 运行 时重新加载 net.thucydides.core.util.SystemEnvironmentVariables
的选项?
最近遇到了同样的问题,但幸运地找到了解决方案:
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
我有一个基于 serenity-bdd/serenity-cucumber-starter project. I'm using 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
,它允许您定义容器公开端口将绑定到的主机端口。
我宁愿使用不同的方法,正如开发人员所说
While this works, we strongly advise against using fixed ports, since this will automatically lead to integrated tests (which are an anti pattern).
那么问题来了:如何在运行时修改webdriver.remote.url
的值呢? serenity-bdd
是否提供了在 运行 时重新加载 net.thucydides.core.util.SystemEnvironmentVariables
的选项?
最近遇到了同样的问题,但幸运地找到了解决方案:
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