Geb 中有没有一种方法可以自动将正确的模块分配给表单中的所有元素

Is there a way in Geb to automatically assign the right Module to all Elements in a Form

我们使用 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 { $("#form")}" 的工作原理,我可以通过提供表单来按名称访问所有子元素,那会乖一点!

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

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
    }

}

那么你会像这样使用它:

static content = {
    form { $("#form").module(FormModule) }
}

form.button1().click()