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
замедляет тест, в результате чего страница отображается правильно.