geb: RequiredPageContentNotPresent после запроса входа

У меня есть следующие настройки:

class LoginPage extends Page {
    def login() { //fill user/pass, click "login"}
}

class IndexPage extends Page {
    static content = {
        sideTabs { module SideTabs }
    }
}

class TabAPage extends Page {
    //...
}

class SideTabs extends Module {
    static content = {
        tabA(to: TabAPage) { $(".sidetab-label", text: "tab A") }
    }
}

class TabALoginSpec extends GebReportingSpec {

    def setup() {
        to LoginPage
    }

    def "test foo"() { /* ... */ }

    def "test bar"() {

        when: 
        login()
//        report "after login"
        at IndexPage
        sideTabs.tabA.click()
        //...

        then: 
        // ...
    }
}

Когда я выполняю "тест бар", я получаю:

geb.error.RequiredPageContentNotPresent: The required page content 'IndexPage -> sideTabs: SideTabs -> tabA: geb.navigator.EmptyNavigator' is not present

Когда я выполняю "строку теста" и раскомментирую строку отчета, тест проходит.

Поэтому я предполагаю, что проблема заключается в возврате "at IndexPage" до того, как страница закончила загрузку. Я не думаю, что login() должен ждать для любого контента, потому что, если вход в систему не удастся, тогда не будет проблем с загрузкой контента, и если вход в систему пройдет успешно - страница перейдет в индекс. Я пытался добавить wait:true к определению содержания tabA, безрезультатно.

Как ни странно, на скриншотах, которые выдает geb после сбоя "тестовой панели", я могу заметить элемент tabA...

Помощь приветствуется.

Обновить:

добавление

void onLoad(Page previousPage) {
    waitFor { sideTabs.tabA }
}

до IndexPage, кажется, до сих пор решает проблему. Мне непонятно зачем добавлять wait:true чтобы определение содержания не дало того же результата.

3 ответа

Добавление обязательного:false должно работать, но размещено здесь:

class SideTabs extends Module {
    static content = {
        tabA(required:false, to: TabAPage) { $(".sidetab-label", text: "tab A") }
    }
}

Если вы не хотите ждать загрузки всего содержимого, прежде чем взаимодействовать со страницей, используйте required: false при определении вашего контента.

например

class IndexPage extends Page {
    static content = {
        sideTabs(required: false) { module SideTabs }
    }
}

Предполагаемое использование требуемого оператора предназначено для скрытого содержимого, которое можно сделать видимым после взаимодействия страницы. Но это должно помочь в этом сценарии.

Хорошей практикой является добавление at в классе IndexPage проверьте документацию здесь.

Ваш класс должен выглядеть так:

class IndexPage extends Page {

static at = {...}

static content = {
    sideTabs { module SideTabs }
    }
}

Я думаю, что с помощью report замедляет тест, в результате чего страница отображается правильно.

Другие вопросы по тегам