使用javascript创建的页面的Grails Gebish Functional Tests

时间:2014-08-14 08:30:43

标签: javascript grails selenium htmlunit geb

我正在写一个测试类

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
}

但似乎没有任何效果。 任何输入?

3 个答案:

答案 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") }
 }