2017-05-05 88 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