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

问题描述 投票:0回答:1

我们使用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“)}”的工作方式,那么我只需提供表单即可访问其名称的所有子元素,那将是很好的!

groovy geb
1个回答
2
投票

对于基于表单控件创建模块的示例,您需要获取该控件的导航器,而不是其值。通过调用与您尝试访问的控件相同的方法来完成此操作(在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()

0
投票

感谢这篇文章的解决方案确实有所帮助。谢谢@erdi。

© www.soinside.com 2019 - 2024. All rights reserved.