Создание экземпляров PageObject из Cucumber StepDefinitions

Я пытаюсь следовать этому руководству в Интернете: https://www.youtube.com/watch?v=x5Ru0f8uOqw&list=PL_noPv5wmuO_t6yYbPfjwhJFOOcio89tI&index=14

и закодировали PageObjects, файл Feature и файл StepDefs точно так же, как в демонстрации. Однако, когда я запускаю, я получаю исключение нулевого указателя в Line16, contactPage в методе @When.

public class StepDefinition {

WebDriver driver = new FirefoxDriver();
LandingPage landingPage;
ContactPage contactPage;

@Given("^I am on the zoo site$")
public void i_am_on_the_zoo_site() throws Throwable {
    LandingPage landingPage = new LandingPage(driver);
    landingPage.navigateToWebApp();
}

@When("^I click on \"(.*?)\"$")
public void i_click_on(String link) throws Throwable {
    contactPage = landingPage.navigateToContactPage(link);
}

... поэтому я попытался создать экземпляр в верхней части класса следующим образом: -

WebDriver driver = new FirefoxDriver();
LandingPage landingPage = new LandingPage(driver);
ContactPage contactPage = new ContactPage(driver);

...и все устраивает.

Должен ли я создавать экземпляр pageobject таким образом? Что было бы наилучшей практикой? И почему код в демонстрации не выдает нулевой указатель?

Для контекста, вот соответствующие объекты страницы: Абстрактная страница: -

public class AbstractPage {

protected WebDriver driver;

public AbstractPage (WebDriver driver){
    this.driver = driver;
}

public LandingPage navigateToWebApp(){
    driver.navigate().to("http://thetestroom.com/webapp/");
    return new LandingPage(driver);
}


public void closeDriver(){
    driver.quit();
    }
}

Целевая страница: -

public class LandingPage extends AbstractPage {


public LandingPage(WebDriver driver) {
    super(driver);
}

public ContactPage navigateToContactPage(String link){
    driver.findElement(By.id(link.toLowerCase() + "_link")).click();
    return new ContactPage(driver);
    }
}

Контактная страница:-

public class ContactPage extends AbstractPage{


public ContactPage(WebDriver driver) {
    super(driver);
}

public ContactPage setNameField(String value){

    driver.findElement(By.name("name_field")).sendKeys(value);
    return new ContactPage(driver);
}

//more setter methods

person Steerpike    schedule 12.06.2015    source источник


Ответы (1)


Да, вам нужно создавать новые экземпляры объектов страницы, т.е.

LandingPage landingPage = new LandingPage(driver);
ContactPage contactPage = new ContactPage(driver);

Это важная практика, так как просто иметь:

LandingPage landingPage

означает, что вашей переменной LandingPage неявно присваивается нулевое значение; вот почему вы получаете исключение нулевого указателя.

person Ben Smith    schedule 16.06.2015