运行时修改远程驱动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