使用javascript创建的页面的Grails Gebish功能测试

使用javascript创建的页面的Grails Gebish功能测试,javascript,grails,selenium,htmlunit,geb,Javascript,Grails,Selenium,Htmlunit,Geb,我正在写一个测试课 class ListOfProjectsSpec extends GebReportingSpec{ def "project dashboard filters are instantiated correctly" () { given: at ProjectIndexPage expect: projectTable != null } } 测试my项目扩展的功能 class Pro

我正在写一个测试课

class ListOfProjectsSpec extends GebReportingSpec{

    def "project dashboard filters are instantiated correctly" () {
        given:
        at ProjectIndexPage

        expect:
        projectTable != null
    }

}
测试my
项目扩展的功能

class ProjectIndexPage extends ProjectsCategoryPage{

    static at = {
        $("title").text() == "Title"
    }

    static content = {
        projectTable {
            $("table.dynamic-projectTable")
        }  
    }
}
(我清理了很多代码,只是为了显示最简单的情况)

并发症

dynamicprojecttable
在运行时添加到表中,其中jquery/javascript作为页面上过滤器的助手

<g:javascript>
    $(
        $('#projectTable').addClass('dynamic-projectTable');
    });
</g:javascript>
其他信息

当查看spock测试的html输出时,很明显,
DynamicProjectTable
类没有被添加(与
$()
jquery调用执行的所有其他操作一样,我在这里删除了它们以使示例更具可读性)

我试过了

// calling the document.ready function explicitly in my test cases
when:
$("document").ready() 
启用的javascript

driver = {
    HtmlUnitDriver driver = new HtmlUnitDriver();
    driver.setJavascriptEnabled(true);
    driver
}
但似乎什么都不管用。
任何输入?

我可以通过在testSpec中明确地重新启用javascript来解决这个问题:

def setup() {
    if (driver instanceof HtmlUnitDriver) {
        driver.javascriptEnabled = true
    }
}

由javascript构建的页面通常需要Geb等待内容呈现。 有关详细信息,请参阅

基本上,我会尝试在规范代码中显式等待:

waitFor { projectTable }
还可以在页面内容上配置等待:

projectTable(wait: true) {
    $("table.dynamic-projectTable")
}

为了避免此类问题,最好定义更适用的at检查

在您的示例中,您使用了:

 static at = {
     $("title").text() == "Title"
 }
尝试检查测试中将使用的内容。例如,表单元素。我还将在at检查器中使用waitFor闭包,以便to调用后的所有页面都可以进行测试

static at = {
     waitFor { $('#projectTable').@class.contains("dynamic-projectTable") }
 }

谢谢你的提示,我改变了这一点&它使我的测试更加可靠。虽然实际问题的解决方案是其他的(见我自己的答案)。谢谢你的提示,我改变了这一点&它使我的测试更加可靠。虽然实际问题的解决方案是其他的(见我自己的答案)。
static at = {
     waitFor { $('#projectTable').@class.contains("dynamic-projectTable") }
 }