Geb:在运行时定义页面对象

时间:2016-02-25 20:17:20

标签: xpath groovy geb

我正在使用geb来自动化Web应用程序。我想定义一个页面对象,让我们称之为Page1。根据环境,Page1可以有不同数量的按钮元素。在一个环境中,按钮' A'可能存在于另一个环境按钮' A'可能不存在。

在运行时,我可以根据我正在使用的环境下载预期按钮的列表。让我们调用这个列表buttonList。我想使用此列表在运行时定义我的页面对象。

现在这就是我试图解决这个问题的方法,但它似乎并没有起作用。我总是得到这个错误:" groovy.lang.MissingMethodException:没有方法签名:groovy.util.slurpersupport.NodeChild.call()"

EndsStr

通常情况下,如果你知道什么样的按钮,那么每次你定义这样的页面对象都是一样的。但是"这个"由于我上面解释的内容,对我来说不是一个选择。

class Page1 extends Page{
    static def buttonList

    static conntent = {
        buttonList.each{ button ->
            button {$(By.xpath("//*[text() = '${button}']")) }
        }
    }
}

在我的顶级测试脚本中,我初始化此类,以便我可以为此页面对象提供所需的buttonList。这是顶级脚本代码的抽象:

class Page1 extends Page{

    static conntent = {
        button1 {$(By.xpath("//*[text() = 'button1']")) }
        button3 {$(By.xpath("//*[text() = 'button3']")) }
        button4 {$(By.xpath("//*[text() = 'button4']")) }
        ...
    }
}

我希望这能解释我所面临的难题。我可能会解决完全错误的方式。我正在寻找有关如何解决此问题的建议。如果问题仍然不明确,请随时发表评论,我可以尝试使事情更清楚。

3 个答案:

答案 0 :(得分:0)

如果我遇到这种情况,我会像这样解决它 -

class Page1 extends Page{

    static content = {
        allButtons { $("input[type=button]")} 
    }
}

或者为您的按钮使用其他一些通用选择器,以便很好地收集它们。然后,当我测试它们时,我会去 -

def "Are my buttons here"() {
    given: "I am on the conundrum causing page"
        at Page1

    and: "I have some expected button text list"
        def expectedButtonText = ["button1","button4","button5","button6"]

    expect: "All your buttons are belong to us"
        allButtons*.text == expectedButtonText
}

其中一些是通用的,但我认为你可以看到模式,只需收集allButtons文本并与预期的列表进行比较,如果这个测试通过,那么你应该很高兴能够参考下面的各个按钮。 / p>

def "Does my button work"() {
    given: "I am on the conundrum causing page"
        at Page1

    when: "I click on one of the buttons"
        allButtons.find(text: "button1").click()

    then: "magic happens"
        // insert goodness here
}

干杯, 出温

答案 1 :(得分:0)

只是添加上面的答案,你总是可以使用标志等待或需要播放一点:

static content = 
{ 
    labelBotonEntrar(wait: true,required: false)
    {
        $("div.gwt-label.newButton-label",1)    
    }
}

答案 2 :(得分:0)

我发现我在这里做错了什么。

此:

class Page1 extends Page{
    static def buttonList

    static conntent = {
        buttonList.each{ button ->
           button {$(By.xpath("//*[text() = '${button}']")) }
        }
    }
}

可以这样定义:

class Page1 extends Page{
    static def buttonList

    static conntent = {
        buttonList.each{ button ->
           "${button}" {$(By.xpath("//*[text() = '${button}']")) }
        }
    }
}

静态内容是一个哈希映射,因此我可以通过这种方式动态定义哈希映射中的所有键/变量。

我确信其中的一些答案是有效的,但这是我在发布这个问题时的目的。