Geb中是否有方法自动将正确的模块分配给表单中的所有元素

问题描述:

我们使用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 {$(”#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 ([email protected]) { 
       case "checkbox": 
        result = result.module(Checkbox) 
        break 
       default: 
        result = result.module(FormElement) 
      } 
     } 
     result 
    } 

} 

那么你可以使用它像:

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

form.button1().click() 
+0

真棒!这个模块应该包含在Geb中! =)Thx! –

+0

这真的很漂亮 – Snekse