我们使用Geb来运行我们的前端测试,并且我们的应用程序中有一些非常复杂的页面。
某些页面的表单带有许多不同的按钮,复选框和一些多选。
我喜欢geb / groovy的功能,我只需要在Page Object中定义表单,然后就可以访问其中的所有元素。
static content = {
form { $("#form")}
}
但是要使它们可单击并查询它们是否为只读,并且更多,它们必须至少为FormElement类型,而上述方法不会发生这种情况。因此,我必须分别提及所有这些FormElement:
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“)}”的工作方式,那么我只需提供表单即可访问其名称的所有子元素,那将是很好的!
对于基于表单控件创建模块的示例,您需要获取该控件的导航器,而不是其值。通过调用与您尝试访问的控件相同的方法来完成此操作(在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()
感谢这篇文章的解决方案确实有所帮助。谢谢@erdi。