2017-05-05 87 views
0

当遵循geb页面对象模式时,我们鼓励创建一个静态值的值块,它代表您试图连接的页面上的元素。创建一个检查器也是很好的。这里是一个例子:对于Geb页面对象,何时初始化静态内容块?

class SomePage extends Page{ 

    static at = {$(By.xpath("some header or something")).displayed} 

    static content = { 
     element1 {$(By.xpath("some xpath1"))} 
     element2 {$(By.xpath("some xpath2"))} 
     //so on and so forth 
    } 
} 

现在我想我已经知道这个问题的答案,但找不到文档来备份它。我很确定,一旦从测试脚本调用“at checker”,就会初始化静态内容块,但我不确定。如果我的建议是真的,那么这将意味着这样的事情:

class SomePage extends Page{ 

    static at = {$(By.xpath("some header or something")).displayed} 

    def someString 

    static content = { 
     element1 {$(By.xpath("//*[contains(text(), ${someString}"))} 
     element2 {$(By.xpath("some xpath2"))} 
     //so on and so forth 
    } 

    def setSomeString(String x){ 
     this.someString = x 
    } 
} 

将是不切实际的权利,或者甚至不可能?这是因为要调用“setSomeString”,您需要调用at检查器来告诉脚本要为方法和变量调用引用哪个类,但是如果调用at检查器,则意味着静态内容将被初始化。此外,如果网页的内容在初次到达网页时没有显示出来,那么您将无法将该内容放入静态内容块中,因为检查器应尽快调用当你到达上述网页时。

我只是想确认或否认这是geb页面对象的行为。考虑到上述情况,我会很乐意听到描述最佳实践的答案。

如果还有一种方法可以重新初始化内容,我也想知道,但我认为没有。

回答

1

一个内容定义评估要求定义的结果每次都:例如 someString:

def somePage = to SomePage //at checker is executed but the defintion for element1 isn't 
somePage.element1 // closure defined for element1 is executed 
somePage.element1 // and here again 

// many lines of code which trigger additional content to show up on the page 

somePage.element1 // closure defined for element1 is executed again 
+0

这么回答我的问题完全是,如果定义somePage.element1的XPath是由另一个字符串变量定义'element1 {$(By.xpath(“// * [contains(text(),$ {someString}”))}' 并且该变量会在您有“//多行代码...”时发生变化,那么element1在最后一行用someString变量的新值重新定义?根据你的回答,我不确定你是否完全理解了这个问题 – switch201

+0

我完全理解了这个问题,是的,元素1“得到了重新定义”在那里面(即使说它重新定义是一种简化,因为它的定义从来没有“固定”,正如我在我的回应中提到的那样)。 – erdi

+0

我测试过了,你是正确的谢谢 – switch201