在运行时修改远程驱动程序URL

时间:2019-08-26 08:28:34

标签: selenium serenity-bdd testcontainers

我有一个基于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

1 个答案:

答案 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