Geb / Groovy - 在其他Page Object方法中使用时无法识别页面内容

时间:2014-04-21 20:22:57

标签: groovy automated-tests geb pageobjects

当我点击一个按钮时,我必须等待呈现一些动态内容。当我在测试中放置waitFor闭包时它可以正常工作。但是,我想将waitFor放在Page对象中的一个方法中,所以我不必总是在每次单击后调用waitFor,但是当我这样做时,它无法声明它找不到该属性。

这不起作用:

class LandingPage extends Page {
    static content = {
        resultsBtn(to: ResultsPage) { $("button", id: "showresults") }
    }

    void getResults() {
        resultsBtn.click()
        waitFor { ResultsPage.results.displayed }
    }
}

class ResultsPage extends Page {
    static content = { 
        results { $("div", id: "listresults") }
    }
}

class ShowResults extends GebReportingTest {
    @Test
    public void displayResults() {
        to LandingPage
        getResults()
    }
}

错误表示“没有这样的属性:类ResultsPage的结果”。

是否可以在其他Page Object方法中引用其他Page Objects中的内容?

编辑:我觉得这更像是一个Groovy而不是Geb.我不确定是否可以访问内容闭包中的绑定。但似乎在Page Object中创建一个getVariable()函数也没什么用。

1 个答案:

答案 0 :(得分:0)

首先,您不应该在内容块中分配闭包(=中有不必要的ResultPage)但是将它们传递给隐式方法,您应该:

static content = { 
    results { $("div", id: "listresults") }
}

另一个问题是为什么要将其建模为两页?据我所知,点击按钮不会导致页面重新加载,但是有一个ajax调用来检索结果。我只想将resultsresultsBtn作为一页的内容,您的问题就会消失。

修改

事实证明,您的案例中涉及到页面更改。假设您总是希望等待这些结果出现,您可以:

  • waitFor条件放在static at = {} ResultsPage区块内waitFor - at checks are executed implicitly whenever you use to(),这意味着它会等到您转到该页面的任何位置
  • LandingPage放入page change listener
  • 通过页面上的浏览器属性访问当前页面waitFor { browser.page.results.displayed }:{{1}}但这对我来说似乎是一个肮脏的解决方案 - 从一个页面到另一个页面......