我正在写一个测试类
class ListOfProjectsSpec extends GebReportingSpec{
def "project dashboard filters are instantiated correctly" () {
given:
at ProjectIndexPage
expect:
projectTable != null
}
}
测试ProjectIndexPage
的功能。
class ProjectIndexPage extends ProjectsCategoryPage{
static at = {
$("title").text() == "Title"
}
static content = {
projectTable {
$("table.dynamic-projectTable")
}
}
}
(我清理了很多代码以仅显示最简单的情况)。
并发症
类dynamic-projectTable
在运行时添加到表中,并使用jquery / javascript作为页面上过滤器的附件。
<g:javascript>
$(
$('#projectTable').addClass('dynamic-projectTable');
});
</g:javascript>
错误
junit.framework.AssertionFailedError: geb.error.RequiredPageContentNotPresent:
The required page content 'projectTable- SimplePageContent (owner: ProjectIndexPage, args: [],
value: null)' is not present
其他信息
当查看spock测试的html输出时,很明显没有添加dynamic-projectTable
类(与$()
jquery调用执行的所有其他操作一样 - 我在这里删除了它们这个例子更具可读性)
我试过
// calling the document.ready function explicitly in my test cases
when:
$("document").ready()
启用了javascript
driver = {
HtmlUnitDriver driver = new HtmlUnitDriver();
driver.setJavascriptEnabled(true);
driver
}
但似乎没有任何效果。 任何输入?
答案 0 :(得分:1)
由javascript构建的页面通常需要Geb等待呈现内容。 有关详细信息,请参阅http://www.gebish.org/async。
基本上,我会尝试在您的规范代码中明确等待:
waitFor { projectTable }
也可以在页面内容上配置等待:
projectTable(wait: true) {
$("table.dynamic-projectTable")
}
答案 1 :(得分:0)
我能够通过在测试规范中明确重新启用javascript来解决它:
def setup() {
if (driver instanceof HtmlUnitDriver) {
driver.javascriptEnabled = true
}
}
答案 2 :(得分:0)
为了避免这样的问题,最好定义更适用于支票。
在您的示例中,您使用了:
static at = {
$("title").text() == "Title"
}
尝试检查将在测试中使用的内容。例如表单元素。我还会在at检查器中使用waitFor闭包,以便在调用之后所有页面都可以进行测试。
static at = {
waitFor { $('#projectTable').@class.contains("dynamic-projectTable") }
}