我们使用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")}"工作,我可以通过只是提供表单来访问所有子元素,这将是很好的!
答案 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
}
}