Serenity. Составной PageObject. NullPointerException

java
webdriver
Теги: #<Tag:0x00007fedbaf2a490> #<Tag:0x00007fedbaf2a120>

(inkvizitorz) #1

Есть консоль (напоминает проводник) - описывается классом BaseConsolePage
Консоль состоит из нескольких фреймов. Один из них описывается классом BaseFrameToolbarPage
У консоли есть потомки, например ModelConsoleRkPage.
Я попытался включить один PageObject в другой. В данном случае BaseFrameToolbarPage в BaseConsolePage

public class BaseConsolePage extends PageObject {
    public BaseFrameToolbarPage baseFrameToolbarPage = new BaseFrameToolbarPage();

    public BaseFrameToolbarPage getBaseFrameToolbarPage() {
        return baseFrameToolbarPage;
    }

    public void setBaseFrameToolbarPage(BaseFrameToolbarPage baseFrameToolbarPage) {
        this.baseFrameToolbarPage = baseFrameToolbarPage;
    }
}    

public class BaseFrameToolbarPage extends PageObject {
    @FindBy(xpath=".//*[@id='tool_bp_1']//button[@title='Выйти']") 
    private WebElementFacade buttonExit;
    
    @FindBy(xpath=".//*[@id='tool_bp_1']//button[@title='Поиск']") 
    private WebElementFacade buttonSearch;
    
    public void clickButtonExit () {
        buttonExit.waitUntilClickable();
        buttonExit.click();
    }
    
    public void clickButtonSearch() {
        buttonSearch.waitUntilClickable();
        buttonSearch.click();
    }
}

public class ModelConsoleRkPage extends BaseConsolePage {
    //...
}

вот так все работает

@Step 
public void should_be_logout_from_console_without_switch () {
    switchToFrame(baseConsolePage, "toolbar");
    baseConsolePage.getBaseFrameToolbarPage().clickButtonExit();
}

а вот так при вызове

consolePageObj.getBaseFrameToolbarPage().clickButtonSearch(); 

возникает ошибка java.lang.NullPointerException: null

@Step 
public <T extends BaseConsolePage> void should_be_completed_simple_search_in_console_and_delete_all_found_object (String searchData, Class<T> consolePageClass) {
    T consolePageObj = getPages().onSamePage().get(consolePageClass);
    switchToFrame(consolePageObj, "toolbar");
    consolePageObj.getBaseFrameToolbarPage().clickButtonSearch();
    //...
}

вызываю в Story таким образом:

userModel.should_be_completed_simple_search_in_console_and_delete_all_found_object(snils, ModelConsoleRkPage.class);

если передать в качестве параметра сам родительский класс

userModel.should_be_completed_simple_search_in_console_and_delete_all_found_object(snils, BaseConsolePage.class);

то ошибка таже самая

Подскажите, пожалуйста, где я ошибся?


(Kosmos) #2

компилятор должен подсветить строку, в кот произошла ошибка.


(inkvizitorz) #3

Компилятор (Eclipse) ничего не подсвечивает.

Ошибка происходит при вызове метода во время выполнения теста

consolePageObj.getBaseFrameToolbarPage().clickButtonSearch();

здесь consolePageObj - объект класса BaseConsolePage или его потомка

Если не передавать в качестве параметра, а вызывать напрямую, то все работает

baseConsolePage.getBaseFrameToolbarPage().clickButtonExit();

(Kosmos) #4

что-то не видно, где создается эта переменная.

А если просто baseConsolePage.getBaseFrameToolbarPage().clickButtonExit(); ?

Трудно сказать, не видно весь стек ошибок.


(inkvizitorz) #5

стек ошибок:

java.lang.NullPointerException: null
        at ru.refactoring.pages.BaseFrameToolbarPage.clickButtonSearch(BaseFrameToolbarPage.java:70)
        at ru.refactoring.steps.ModelSteps.should_be_completed_simple_search_in_console_and_delete_all_found_object(ModelSteps.java:388)
        at ru.refactoring.stories.AuthorizeLkStoryTest.a_check_and_delete_snils_and_esiaid_and_personal_affair_in_rk(AuthorizeLkStoryTest.java:102)

Переменная создается так:

T consolePageObj = getPages().onSamePage().get(consolePageClass);

(inkvizitorz) #6

Так как раз успешно работает.


(inkvizitorz) #7

В итоге решил (не знаю, все ли верно или нет, но по крайней мере работает).

Добавил конструкторы к классам:

public class BaseConsolePage extends PageObject {
    public BaseConsolePage(WebDriver driver) {
        super(driver);
        baseFrameToolbarPage = new BaseFrameToolbarPage(driver);
    }
    public BaseFrameToolbarPage baseFrameToolbarPage;
}

public class ModelConsoleRkPage extends BaseConsolePage {
    public ModelConsoleRkPage(WebDriver driver) {
        super(driver);
    }
}

public class BaseFrameToolbarPage extends PageObject {
    public BaseFrameToolbarPage (WebDriver driver) {
        super(driver);
    }
}