混合 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
创建对象,这不会导致真正的驱动程序创建。仅当您执行使用它的测试时才会创建驱动程序。
我继承了一个 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
创建对象,这不会导致真正的驱动程序创建。仅当您执行使用它的测试时才会创建驱动程序。