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()
真棒!这个模块应该包含在Geb中! =)Thx! –
这真的很漂亮 – Snekse