7

私は機能テストを書いており、フェードインとフェードアウトするモーダル ウィンドウを扱っています。

表示と 現在 はどう違いますか?

たとえば、私は持っています:

settingsModule.container.displayed and settingsModule.container.present

ここで、settingsModule はモーダル ウィンドウを表します。

モーダル ウィンドウ (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()       
    }

「クリックするには要素を表示する必要があります」という不満が常にあります。

私の openSettingsModal と closeSettingsModal で、waitFor と時間間隔を組み合わせて、present または not を使用してみました ... わかりません。

任意のポインタをいただければ幸いです。ありがとう!

4

3 に答える 3

6

主な違いは、present は DOM に要素があることを確認するのに対し、display はこの要素の可視性を確認することだと思います。

webdriver は、ユーザーがマウスを使用して Web サイトを使用およびクリックする実際のエクスペリエンスをシミュレートするため、要素が表示されていない場合、ユーザーはそれをクリックすることができません。

あなたの問題は、ページが最初に読み込まれたときに settingsLink が DOM にないことに関係しているのだろうか。ダイアログがポップアップし、リンクがこのダイアログに存在するのを待っている場合は、おそらく次のように設定する必要があります

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

あなたのwaitforは次のようになります

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

私はgeb規約の本に固執し、常に表示されたものを使用します.

Geb マニュアル - 可視性の決定

于 2012-08-24T00:18:21.890 に答える
4

お返事をありがとうございます。私は実際に私の問題を解決することができました。

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

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

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 では合格していました!! これは、IE 8 がテストに合格したアニメーションをサポートしていないためだと思います。

今は大丈夫です。

いつか誰かの役に立てば幸いです!

于 2012-08-24T19:21:59.017 に答える