2012-08-23 3 views
7

私は機能テストを書いており、フェードインとフェードアウトするモーダルウィンドウを扱っています。Gebでは、表示と現在の違いは何ですか?

表示とプレゼントの違いは何ですか?例えば

私が持っている:

settingsModuleは私のモーダルウィンドウを表し
settingsModule.container.displayed and settingsModule.container.present 

私のモーダルウィンドウ(Twitterのブートストラップからモーダル)をテスト、私は通常これを行う:上と上

def "should do ... "() { 
    setup: 
    topMenu.openSettingsModal()  

    expect: 
    settingsModule.timeZone.value() == "Asia/Hong_Kong" 

    cleanup: 
    settingsModule.closeSettingsModal() 
} 

def "should save the time zone"() { 
     setup: 
     topMenu.openSettingsModal()    
     settingsModule.timeZone = "Japan" 

     when:    
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 
     settingsModule.alertSuccess.text() == "Settings updated" 

     when: 
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 

     cleanup: 
     settingsModule.closeSettingsModal() 
    } 

と。私のモジュールでは、私が持っている:

void openSettingsModal() {     
     username.click() 
     settingsLink.click()    
    } 

void closeSettingsModal() { 
     form.cancel().click()  
    } 

私はいつも文句を取得:「Elementはをクリックして表示されなければなりません」。

私のopenSettingsModalとcloseSettingsModalでは、私はwaitForと時間間隔の組み合わせを試していましたが、現在かどうかは分かりません。

いずれのポインタも高く評価されます。ありがとう!

答えて

6

主な違いは、現在のところは、DOM内に要素があることをチェックし、この要素の可視性をチェックすることです。

webdriverは、マウスを使用してウェブサイトを使用してクリックしたユーザーの実際の体験をシミュレートしているため、要素が表示されていない場合はクリックできません。

ページが最初に読み込まれたときにsettingsLinkがDOMにないことが問題であるかどうかは疑問です。あなたがポップアップするダイアログと、このダイアログで生活するリンクを待っている場合、あなたはおそらく、あなたのWAITFORが

username.click() 
waitFor{ settingsModal.displayed } 
settingsLink.click() 

ようになるはずです

content{ 
    settingsLink(required: false) { $('...' } 
    settingsModal(required: false) { $('#modalDialog') } 
} 

のように私はに固執すると何かを設定したいですgebの規則の本は、常に表示されます。お返事のための

Geb Manual - Determining visibility

+0

私はあなたのソリューションを試しましたが、うまくいきませんでした。私が提案した解決策は、いくつかの調整を加えて同じ方向に進みます。ありがとうございました! – ontk

4

感謝。私は実際に私の問題を解決することができました。

問題は、モーダルウィンドウのアニメーションが500msだったことです。私のテストでウインドウを数回開いたり閉じたりすると、それらのウインドウが一貫して成功/失敗しました。

私がやったことは、プラグインによって提供された「表示された」イベントをフックすることでした。私はモーダルに "示された"クラスを追加し、1秒間に100msごとにそれをチェックしました。

void openSettingsModal() {  
    username.click() 
    settingsLink.click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 1 } 
} 

void closeSettingsModal() { 
    form.cancel().click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 0 }  
} 

補足として、ChromeとFirefoxではテストが失敗していましたが、IEで渡されました。私はIE8が私のテストが合格していたアニメーションをサポートしていないので、それを推測しています。

今はすべて良いです。

いつか誰かを助けてくれることを願っています!

0

ここではdisplayedを使用できますか?

削除または削除している特定の要素がまだDOMにあり、ページに表示されていない場合は、アサートthatelement.displayed == falseを使用して、その要素がページに表示されていないことを確認できますDOM内)

ここでpresentを使用できますか?上記と同じ例で

、要素がDOMで発見されていない場合は削除した後、あなたが検証

assert thatelement.present == false 

するために本使用する必要があります

がに追加する....あなたが理解してほしいです上記のスクリプトの実行に時間がかかります

関連する問題