我正在使用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']")) }
...
}
}
我希望这能解释我所面临的难题。我可能会解决完全错误的方式。我正在寻找有关如何解决此问题的建议。如果问题仍然不明确,请随时发表评论,我可以尝试使事情更清楚。
答案 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}']")) }
}
}
}
静态内容是一个哈希映射,因此我可以通过这种方式动态定义哈希映射中的所有键/变量。
我确信其中的一些答案是有效的,但这是我在发布这个问题时的目的。