java - 为不同的测试重用相同的网络驱动程序,但不是每次都实例化它

标签 java selenium selenium-webdriver junit

我正在制作一个使用 Selenium Webdriver 在 Web 应用程序上运行测试的项目。我需要能够在 CI 管道中测试不同的浏览器,因此当我执行测试套件时,我指定应使用什么浏览器。

 mvn test -Dwebdriver.gecko.driver="/webdrivers/geckodriver" -Dwebdriver.chrome.driver="/webdrivers/chromedriver" -DbrowserUnderTest="headless-firefox"

测试使用 WebDriver 对象来操作浏览器,因此,为了使代码易于维护,我让每个测试类都继承自一个名为 BasicTest,其中 WebDriver 驱动程序 对象被实例化。

此外,为了使测试执行速度更快,我让测试重用浏览器的同一实例,因此,当测试结束时,下一个测试将使用已经打开的浏览器。这就是为什么在 BasicTest 的代码中,我的 WebDriver 对象被定义为 public static :

    public static FirefoxOptions ff_opt_headless = new FirefoxOptions().setHeadless(true);
    public static ChromeOptions chrome_opt_headless = new ChromeOptions().addArguments("--headless");

    public static WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
    public static WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);

    public static WebDriver driver; 

    public BasicTest() throws Exception {
        String browserUnderTest = System.getProperty("browserUnderTest");
        switch (browserUnderTest) {
        case "headless-firefox":
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            driver = chrome_driver_headless;
            break;
        }
    }

我这里遇到的问题是 firefox_driver_headlesschrome_driver_headless 每次都会实例化,这意味着即使我为测试套件指定 Firefox,Chrome 也会无用地打开。因此,我需要找到一种方法,以便在创建 BasicTest 时不实例化 firefox_driver_headlesschrome_driver_headless 对象。

如果我保持这种方式,当我添加浏览器的驱动程序时,这些驱动程序可能无法在我可以运行测试的每个平台上使用,我将遇到问题。 (例如:如果我的测试在 Linux 上运行,并且我尝试实例化一个 internet_explorer_webdriver 对象,它将失败。)

我已经尝试在 switch case 中实例化它们,如下所示:

public static WebDriver driver;
switch (browserUnderTest) {
        case "headless-firefox":
            WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);
            driver = chrome_driver_headless;
            break;
        }

虽然在我启动测试时不会打开 Chrome,但它还会为每个测试重新打开 Firefox,这不是我想要的:我希望每个测试都重复使用同一浏览器实例.

那么这里的解决方案是什么呢?我是否应该放弃尝试使每个测试都重复使用同一浏览器实例?我打算让 TestSuite 遵循像普通人导航一样的逻辑顺序。 (即,要测试“更改​​头像”功能,将执行 Login 测试,然后执行 AccessProfile 测试,然后更改头像...)

最佳答案

将开关逻辑移至static initialization block ,这样它只在加载 BasicTest 类时执行一次

static {
    ...
}

关于java - 为不同的测试重用相同的网络驱动程序,但不是每次都实例化它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649725/

相关文章:

java - 如何检查web服务是否可用,然后一次性连接上?

Python在网页弹出窗口中从电脑中选择图像

java - 在 selenium webdriver 中无需定位器即可验证文本的存在和可见性

java - 检测类时,插入的堆栈帧的偏移量与现有堆栈帧重叠

java - Servlet 过滤器是否可以检索其 url 路径?

java - jaxb 和 serializable from marshalling server.xml for tomcat server

java - 无法使用 selenium webdriver 清除文本区域字段

python - 当使用 Selenium 和 Python 传递值时,动态下拉列表不会填充 https ://www. nseindia.com/上的自动建议

c# - selenium webdriver错误引发了带有null响应的异常,该异常将HTTP请求发送到远程WebDriver服务器以获取URL

java - 使用 cssSelector 按文本选择嵌套元素 - Selenium WebDriver