При использовании внедрения зависимостей вы хотите, чтобы ваша система DI выполняла всю тяжелую работу. Таким образом, у ваших определений шагов есть зависимость конструктора от объектов вашей страницы.
public class NewSignUpFlowStepDefinitions {
private final LoginPage poLogin;
private final SignUpPage poSignup;
NewSignUpFlowStepDefinitions(LoginPage poLogin, SignUpPage poSignup) {
this.poLogin = poLogin;
this.poSignup = poSignup;
}
@Given("I am on Login Page")
public void iAmOnLoginPage() {
assertThat("ON LOGIN PAGE", poLogin.isLoginScreen(), equalTo(true));
}
@When("I tap on Sign Up Link")
public void iTapsOnSignUpLink() {
poLogin.clickSignUp();
}
}
У ваших страниц не может быть зависимости конструктора от IOSDriver<IOSElement>
, потому что PicoContainer может создавать только цепочки зависимостей, которые не заканчиваются пустымиконструкторы. Поэтому вместо этого мы используем IOSDriverManager
здесь.
public class BiosurveyPage extends BasePage {
public BiosurveyPage(IOSDriverManager driverManager) {
super(driverManager);
}
}
В вашем BasePage
вы затем распаковываете веб-драйвер из диспетчера драйверов.
public abstract class BasePage {
private IOSDriverManager driverManager;
public BasePage(IOSDriverManager driverManager) {
this.driverManager = driverManager;
initElements();
}
private void initElements() {
PageFactory.initElements(new AppiumFieldDecorator(driverManager.getDriver()), this);
}
protected IOSDriver<IOSElement> getDriver() {
return driverManager.getDriver();
}
}
Затем в IOSDriverManager
выможет сохранить ссылку на веб-драйвер и создать его по мере необходимости. Если вы уверены, что ваш веб-драйвер безопасен для совместного использования между сценариями, вы все равно можете использовать ThreadLocal
здесь.
public class IOSDriverManager implements Disposable{
private IOSDriver<IOSElement> webDriver;
private DesiredCapabilities getIOSCapsLocal() {
DesiredCapabilities caps = new DesiredCapabilities();
return caps;
}
private void createWebDriver() {
webDriver = new IOSDriver<IOSElement>(new URL(APPIUM_SERVER_URL), getIOSCapsLocal());
}
public IOSDriver<IOSElement> getDriver() {
if (webDriver == null) {
createThreadLocalWebDriver();
}
return webDriver;
}
@Override
public void dispose() {
// Stop webdriver ehre
}
}
Обратите внимание, что Disposable
добавляет метод dispose, который позволит вам очистить драйверпосле каждого сценария. Либо полностью утилизировать, либо вернуть в известное состояние.
http://picocontainer.com/lifecycle.html