Geb WaitFor Element的类刷新问题

时间:2015-03-13 10:17:40

标签: spock geb

我有一个JSF / ADF页面,其中有一个以

开头的“按钮”
<a id="pt1:r1:0:proBut" class="xfe p_AFDisabled" style="text-decoration:none;">
  <span id="pt1:r1:0:pgl13" class="x26j x1a">Proceed</span>
</a>

然后按下另一个按钮,将此按钮更改为启用。

<a id="pt1:r1:0:proBut" class="xfe" href="#" onclick="return false;" style="text-decoration:none;">
  <span id="pt1:r1:0:pgl13" class="x26j x1a">Proceed</span>
</a>

您可以看到a元素有不同的类。当元素被禁用时,它的类是“xfe p_AFDisabled”,当它处于活动状态时,它会变为“xfe”。

我有一个Geb页面,其中包含一个等待按钮启用的方法,看起来像这样

   class CustomerSelection extends Page {
    static at = { waitFor(100) {$("div",id:"pt1:pt_pgl10").$("div").$("span").text() == "Customer Selection"} }
    static content = {
        customers { $("div",id:"pt1:r1:0:pc1:tt1::db").$("table").$("tbody")}
        proceedButton(to: Dashboard) { $("a",id: "pt1:r1:0:proBut",class: "xfe")}   
    }

    void selectCustomer(int position) {
        customers.$("tr",position).click()
        println "selected customer!"
        waitFor {proceedButton.present}
        println "proceedButton present " + proceedButton.@class
    }

    void proceed() {
        proceedButton.click()
    }
}

然而,当我通过SpockTest

运行此测试时
package xx;

import geb.spock.GebReportingSpec

class LoginSpec extends GebReportingSpec {

    def "login"() {
        when:
            to Login
            report "login screen"
        and:
            login(username,password)
        and:
            at CustomerSelection
        and:
            selectCustomer(0)
        and:
            proceed()
        then:
            at Dashboard
        where:
            username   | password
            "x"        | "x"
    }

}

println的输出是

selected customer!
proceedButton present xfe p_AFDisabled

这表明该类仍然是xfe p_AFDisabled并且尚未完成处理。

好像是

waitFor {proceedButton.present}

无法正常工作?

编辑---

我已将waitFor改为

waitFor {proceedButton.@class == "xfe"}

和proceedButton定义到

proceedButton(to: Dashboard) { $("a",id: "pt1:r1:0:proBut")}    

因此删除了class属性

哪个有效,但我对解决方案不满意,因为现在有2个地方有DOM特定任务。我希望将class属性移回按钮定义?

编辑2 ----

我在Geb页面中添加了一个新元素,如下所示:

proceedButtonActive(wait: true, required: false) {proceedButton.@class == "xfe"}

然后我可以在selectCustomer方法中调用此元素并且它可以工作。但是,该逻辑仍然需要2个元素。 1是理想的。

1 个答案:

答案 0 :(得分:3)

您需要更改选择器以过滤掉p_AFDisabled类的元素:

proceedButton(to: Dashboard, required: false) { 
    $("a", id: "pt1:r1:0:proBut").not(class: "p_AFDisabled") 
}

从技术上讲,您甚至不需要在isPresent()上致电processButton,因为如果它不存在,那么该定义将返回&#34; falsey&#34;值waitFor {}将不会返回。所以selectCustomer()变为:

void selectCustomer(int position) {
    customers.$("tr",position).click()
    waitFor { proceedButton }
}