您正在寻找一种在步骤之间共享状态的方法。并且使用 webdriver 的单个静态实例不一定是一个坏方法。
但这也意味着您在场景之间共享状态。这意味着您必须在每个场景之前清理 webdriver。场景之间的任何状态共享都会阻止您并行运行场景。
要在步骤之间共享状态,而不是在场景之间共享它,您可以使用依赖注入。例如cucumber-picocontainer。
<dependencies>
[...]
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
Cucumber 然后可以将步骤定义与其他对象一起注入。但是因为WebDriver 是一个接口,所以您必须定义一个没有构造函数的类才能用作 Web 驱动程序。
public class LazyWebDriver implements Webdriver, Disposable {
private final Webdriver delegate;
private Webdriver getDelegate() {
if (delegate == null) {
delegate = // create webdriver here
}
return webdriver;
}
@Override
public void dispose() {
if (webDriver == null) {
return;
}
// Stop webdriver here
}
@Override
public void someDelegatedMethod() {
getDelegate().doSomeThing();
}
// more delegated methods here
...
}
然后您可以将惰性网络驱动程序注入到您的步骤中:
public class SomeStepDefinitions {
private final WebDriver webDriver;
SomeStepDefinitions(LazyWebDriver webDriver) {
this.webDriver = webDriver;
}
// step definitions here
}
public class SomeOtherStepDefinitions {
private final WebDriver webDriver;
SomeOtherStepDefinitions(LazyWebDriver webDriver) {
this.webDriver = webDriver;
}
// step definitions here
}
请注意,Disposable 添加了 dispose 方法,可让您在每个场景之后清理驱动程序。
http://picocontainer.com/lifecycle.html