2016-02-05 75 views
0

我們使用Geb來運行我們的前端測試,並且在我們的應用程序中有一些相當複雜的頁面。Geb中是否有方法自動將正確的模塊分配給表單中的所有元素

一些頁面的表單有很多不同的按鈕,複選框和一些多選。

我喜歡geb/groovy的功能,我只需要在頁面對象中定義窗體,然後就可以訪問其中的所有元素。

static content = { 
    form { $("#form")} 
} 

但他們可以點擊並詢問他們是否是隻讀的,更多的,他們需要至少類型FormElement不與上述方法發生。所以我要單獨提及這些FormElements:

static content = { 
    form { $("#form")} 
    button1 { $("#button1").module(FormElement)} 
    button2 { $("#button2").module(FormElement)} 
    checkbox{ $("#checkbox").module(Checkbox)} 
    ... 
} 

所有這些按鈕,複選框......已經在表單變量,但不能被點擊或檢查,如果他們選擇等。它也不可能事後應用模塊是這樣的:

def "test something"() { 
    when: 
     form.button1.module(FormElement).click() //error 
    then: 
     ... 
} 

有沒有辦法自動分配每個輸入,複選框,單選按鈕,按鈕...正確的根據自己的類型的模塊,而不需要用手做?

如果有人也可以指出我正確的方向來理解這個「form {$(」#form「)}」是如何工作的,那麼我可以通過提供它的名字來訪問所有的子元素,只需提供表單即可對人好點!

回答

2

對於基於窗體控件創建模塊的示例,您需要獲取控件的導航器,而不是它的值。它是通過調用一個名爲一樣的,你要訪問控制方法來實現(它在this section of The Book of Geb解釋):

form.button1().module(FormElement).click() 

如果你想自動創建基於元素類型,那麼你可以創建一個Module模塊的形式和覆蓋方法丟失:

class FormModule extends Module { 

    Object methodMissing(String name, Object args) { 
     def result = super.methodMissing(name, args) 
     if (result instanceof Navigator && result.tag() == "input") { 
      switch ([email protected]) { 
       case "checkbox": 
        result = result.module(Checkbox) 
        break 
       default: 
        result = result.module(FormElement) 
      } 
     } 
     result 
    } 

} 

那麼你可以使用它像:

static content = { 
    form { $("#form").module(FormModule) } 
} 

form.button1().click() 
+0

真棒!這個模塊應該包含在Geb中! =)Thx! –

+0

這真的很漂亮 – Snekse

相關問題