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()
我们使用 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()