Это урезанная версия параллельного использования драйверов селена. Это должно быть похоже на принятие к драйверу appium. Это использует пико-контейнер для создания объекта и совместного использования в сценарии. Необходимо добавить зависимость cucumber-picocontainer.
DriverFactory
сохраняет все драйверы в переменной ThreadLocal drivers
.
public final class DriverFactory {
private static ThreadLocal<WebDriver> drivers = new ThreadLocal<>();
//To quit the drivers and browsers at the end only.
private static List<WebDriver> storedDrivers = new ArrayList<>();
static {
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
storedDrivers.stream().forEach(WebDriver::quit);
}
});
}
private DriverFactory() {}
public static WebDriver getDriver() {
return drivers.get();
}
public static void addDriver(WebDriver driver) {
storedDrivers.add(driver);
drivers.set(driver);
}
public static void removeDriver() {
storedDrivers.remove(drivers.get());
drivers.remove();
}
}
Существует исключительно для разрешения пико-контейнера для создания требуемого драйвера. Проверяет, существует ли уже драйвер для повторного использования потока. Чтобы избежать этого, вы можете взглянуть на расширение класса ThreadLocal
и настройку метода initialValue()
.
public class SharedDriver {
public SharedDriver() {
if (DriverFactory.getDriver() == null) {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
DriverFactory.addDriver(new ChromeDriver());
}
}
}
public class GoogleHomePO extends LoadableComponent<GoogleHomePO>{
@FindBy(name="q")
private WebElement searchTextBox;
public GoogleHomePO() {
DriverFactory.getDriver().get("https://www.google.com/");
PageFactory.initElements(DriverFactory.getDriver(), this);
}
public void enterSearch(String search) {
searchTextBox.sendKeys(search);
}
}
Класс SharedDriver
необходимо добавить в любой одноэтапный конструктор определения в проекте. По мере того как cucumber инициализирует все классы step и hook для каждого сценария, picocontainer будет создавать экземпляр объекта драйвера, если это потребуется, и сохранять его в DriverFactory.
public class StepDefinition {
private GoogleHomePO gmPO;
public StepDefinition(SharedDriver driver, GoogleHomePO gmPO) {
this.gmPO = gmPO;
}
@Given("Go to google page")
public void given() {
gmPO.get();
}
@When("Enter search {string}")
public void when(String search) {
gmPO.enterSearch(search);
}
}
Файл функций 1
Feature:
Scenario: First
Given Go to google page
When Enter search "From Feature One"
Scenario: First Again
Given Go to google page
When Enter search "From Feature One Again Again"
Файл функций 2
Feature:
Scenario: Second
Given Go to google page
When Enter search "From Feature Two"
Настройки POM
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
</goals>
<configuration>
<includes>
<include>**/*Runner.java</include>
</includes>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</execution>
</executions>
</plugin>
</plugins>