Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 在运行时修改远程驱动程序URL_Selenium_Serenity Bdd_Testcontainers - Fatal编程技术网

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

Selenium 在运行时修改远程驱动程序URL,selenium,serenity-bdd,testcontainers,Selenium,Serenity Bdd,Testcontainers,我有一个基于该项目的项目。我正在使用启动两个Docker容器以及一个Selenium网格容器来运行测试 new GenericContainer<>(SELENIUM_IMAGE) ... .withExposedPorts(SELENIUM_CONTAINER_PORT, SELENIUM_CONTAINER_NOVNC_PORT) ... ); 因此,我需要一种以编程方式设置webdriver.remote

我有一个基于该项目的项目。我正在使用启动两个Docker容器以及一个Selenium网格容器来运行测试

new GenericContainer<>(SELENIUM_IMAGE)
            ...
            .withExposedPorts(SELENIUM_CONTAINER_PORT, SELENIUM_CONTAINER_NOVNC_PORT)
            ...
);
因此,我需要一种以编程方式设置webdriver.remote.url的方法

一个选项是使用FixedHostPortGenericContainer,它允许您定义容器公开端口将绑定到的主机端口

不过,正如开发人员所说,我更愿意使用一种不同的方法

虽然这样做有效,但我们强烈建议不要使用固定端口,因为这将自动导致集成测试,这是一种反模式测试


所以问题是:如何在运行时修改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中定义:

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;
    }
}
webdriver.driver = provided
webdriver.provided.type = mydriver
webdriver.provided.mydriver = <your_factory_package>.CustomWebDriverFactory
thucydides.driver.capabilities = mydriver