Geb中是否有一种方法可以自动将正确的模块分配给表单

时间:2016-02-05 09:38:35

标签: groovy geb

我们使用Geb来运行我们的前端测试,我们的应用程序中有一些非常复杂的页面。

某些页面的表单包含许多不同的按钮,复选框和一些多选项。

我喜欢geb / groovy的特性,我只需在页面对象中定义表单,然后就可以访问其中的所有元素。

static content = {
    form { $("#form")}
}

但是为了使它们可以被点击并查询它们是否是只读的,它们需要至少是FormElement类型,这在上述方法中是不会发生的。所以我必须分别提到所有这些FormElements:

static content = {
    form { $("#form")}
    button1 { $("#button1").module(FormElement)}
    button2 { $("#button2").module(FormElement)}
    checkbox{ $("#checkbox").module(Checkbox)}
    ...
}

所有这些按钮,复选框......已经在表单变量中,但如果选中它们则无法单击或检查,依此类推。之后也不可能像以下那样应用模块:

def "test something"() {
    when:
        form.button1.module(FormElement).click() //error
    then:
        ...
}

是否无法根据其类型自动分配每个输入,复选框,单选按钮,按钮,...正确的模块而无需手动操作?

如果有人也可以指出我正确的方向来理解这个"形成{$("#form")}"工作,我可以通过只是提供表单来访问所有子元素,这将是很好的!

1 个答案:

答案 0 :(得分:2)

对于基于表单控件创建模块的示例,您需要获取控件的导航器而不是它的值。这是通过调用一个名为与您尝试访问的控件相同的方法完成的(在this section of The Book of Geb中有解释):

iframe

如果您想根据元素类型自动创建模块,那么您可以为表单和覆盖方法创建form.button1().module(FormElement).click()

Module

然后你会像以下一样使用它:

class FormModule extends Module {

    Object methodMissing(String name, Object args) {
        def result = super.methodMissing(name, args)
        if (result instanceof Navigator && result.tag() == "input") {
            switch (result.@type) {
                case "checkbox":
                    result = result.module(Checkbox)
                    break
                default:
                    result = result.module(FormElement)
            }
        }
        result
    }

}