我有一个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是理想的。
答案 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 }
}