混合 Web 和非 Web cucumber/selenium 测试避免创建 Web 驱动程序

Mixing web and non-web cucumber/selenium tests avoiding web driver creation

我继承了一个 Java/Cucumber 测试应用程序,它混合了基于 web/Selenium 的测试和基于 REST 的测试。

当任何测试为 运行 时,Cucumber 每隔 class 实例化一次,例如我的步骤和页面工厂 classes。问题是当 运行 基于 REST 的测试 Chrome 驱动程序也启动并且 Chrome 打开时。

如下(缩减代码),对 initElements() 的调用是原因,但我真的不明白 if/when 它是必需的以及如何 remove/lazily 加载或以某种方式删除或移动此调用。

public class XXXPages {
    @FindBy(xpath = "//input[@id='user_name']")
    private WebElement usernameField;

    private WebDriverFactory webDriverFactory;

    public XXXPages(WebDriverFactory webDriverFactory) {
        this.webDriverFactory = webDriverFactory;
        //PROBLEM CALL
        PageFactory.initElements(webDriverFactory.getDriver(), this);

    }

    public XXXPages searchName() {
        WebDriverWait wait = new WebDriverWait(webDriverFactory.getDriver(), Duration.ofSeconds(3));
        wait.until(ExpectedConditions.elementToBeClickable(searchNamefield));
        searchNamefield.click();
        return this;
    }

}



public class WebDriverFactory implements Closeable {
    private RemoteWebDriver webDriver;
    final String driverPath = System.getProperty("webdriver.chrome.driver", "src/test/resources/drivers/linux/chromedriver");

    private void createDriver(){
        System.setProperty("webdriver.chrome.driver", driverPath);
        final ChromeOptions chromeOptions = new ChromeOptions();

        this.webDriver = new ChromeDriver(chromeOptions);
    }

    public RemoteWebDriver getDriver() {
        if (this.webDriver == null){
            createDriver();
            return webDriver;
        }
        return webDriver;
    }

    @Override
    public void close() {
        webDriver.quit();
    }

}

您需要以惰性初始化方式为您的驱动程序设计一个包装器。实现一个 class,它将实现 WebDriver 接口,并在第一次调用该方法时初始化驱动程序。喜欢:

public class LazyWebDriver implements WebDriver, Disposable {

    private WebDriver delegate = null;

    private WebDriver getDelegate() {
        if (delegate == null) {
            String driverPath = System.getProperty("webdriver.chrome.driver", "src/test/resources/drivers/linux/chromedriver");
            System.setProperty("webdriver.chrome.driver", driverPath);
            ChromeOptions chromeOptions = new ChromeOptions();
            delegate = new new ChromeDriver(chromeOptions);
        }
        return delegate;
    }

    @Override
    public void get(String url) {
        getDelegate().get(url);
    }

    // Override other methods here..
}

阅读 this post 完整示例中描述这种方法的地方可能对您有用。

使用上述方法会使 cucumber 为 LazyWebDriver 创建对象,这不会导致真正的驱动程序创建。仅当您执行使用它的测试时才会创建驱动程序。