2017-02-06 7 views
0

GebとSpock Frameworkを使用してブラウザセッション中期テストを再開したいと考えています。私はどのようにブラウザを閉じて、テストcompltionなどの後に更新する方法はありませんが、私はテスト中にクローズし、ブラウザオブジェクトを使用して再試行すると、セレンによってスローされたセッションエラーが発生します。以下は私が実行しようとしている基本的な概要です。 NBは私に新しいStoreHomeにナビゲートすることを許しません。もし私がブラウザを試してみると、エラーがスローされます。私はそれをテスト同じテストでGeb&Spockを使用してブラウザを再起動する

CachingDriverFactory.clearCache() 

が、それは見事に動作します:

@Category(High.class) 
def "TC1: Verify Browser Restart"() { 
    when: "On my StoreFront HP wait until title displayed" 
    to StoreHomePage 
    waitFor { homepagetitle.displayed } 

    then: "Update your site picker" 
    mySitePicker.click() 
    waitFor { myNewHomePageTitle.displayed } 

    when: "Close the browser and insure on restart new page is loaded" 
    browser.close() 
    browser.quit() 

    def nb = new Browser() 
    nb.to(NewStoreHomePage) 

    then: "Validate on New HP" 
    asset myNewHomePageTitle.displayed 
} 

答えて

0

これは、あなたが新しいドライバを強制する方法です。このヒントは、Geb manualにも記載されています。


アップデート2017年2月7日午前15時10分CET:フォローアップの質問の感謝。さて、私の簡単な答えは、コマンドが1つのフィーチャメソッドで発行され、次のフィーチャメソッドが新しいブラウザセッションから開始されるという前提の下で行われました。この中間テストを行うには、手動で新しいWebDriverインスタンスを作成し、Gebにブラウザセッションの更新を騙す必要があります。

これは少なくとも難しく、私はそれを行う方法がわからないので、ブラウザを終了する前後にテストする必要があるものをテストするために、2つの別個のフィーチャメソッドを使用することをお勧めします。必要に応じて、@Sharedのメンバーを介してそれらの間で状態を共有できます。これには、Gebに新しいWebDriverとブラウザセッションを作成させる場合、ブラウザのタイプや機能など、GebConfig.groovyで設定されたすべてが自動的に考慮されるという利点もありました。手動でドライバを作成する場合は、自分でGebの設定を解析する必要があります - 醜い!

しかし、このアプローチの主な問題は、フィーチャメソッドが宣言の(字句の)順序で実行されることを保証する方法ですか?通常、テストは任意の順序で実行可能である必要があります。したがって、特定の実行順序に頼ることはできません。 Spockは、実行順序を強制する稀なケースを扱うためにStepwiseアノテーションを提供していますが、Gebは暗黙のうちに同じセッションでテストを続けなければならないと仮定しているため、テスト中の状況と同じ問題につながります。私。 @Stepwiseを使わずに字句の実行順序を強制するトリックが必要です。

もう1つの問題は、スクリーンショットを撮るためにGebReportingSpecが拡張された場合、Gebはブラウザーを使用してフィーチャーメソッドの最後に最後のスクリーンショットを撮ることができないということです。今度は、reportOnTestFailureOnlyでテストが成功した場合、スクリーンショットを撮らないようにGebを設定できますが、それでも失敗したテストが残っています。だから私はいくつかの追加の例外処理でreportメソッドのオーバーライドを追加しました。私の実際のテストの1つに由来の完全なソリューションは、このようになります

、:

  • HtmlUnit:ところで

    package de.scrum_master.tdd 
    
    import geb.driver.CachingDriverFactory 
    import geb.spock.GebReportingSpec 
    import org.openqa.selenium.Keys 
    import org.spockframework.runtime.model.FeatureInfo 
    import spock.lang.Shared 
    
    class SampleGebIT extends GebReportingSpec { 
    
        @Override 
        void report(String label = "") { 
        // GebReportingSpec tries to write a report (screenshot) at the end of each feature 
        // method. But because we use 'CachingDriverFactory.clearCacheAndQuitDriver()', 
        // there is no valid driver instance anymore from which to get a screenshot. Geb is 
        // unprepared for this kind of error, so we handle it gracefully so as to keep the 
        // test from failing just because the last screenshot cannot be taken anymore. 
        try { 
         super.report(label) 
        } 
        catch (Exception e) { 
         System.err.println("Cannot create screenshot: ${e.message}") 
        } 
        } 
    
        // We cannot use 'specificationContext' directly from 'setupSpec()' because of this 
        // compilation error: "Only @Shared and static fields may be accessed from here" 
        // Okay then, so use we a @Shared field as a workaround. ;-) 
        @Shared 
        def currentSpec = specificationContext.currentSpec 
    
        def setupSpec() { 
        // Make sure that feature methods are run in declaration order. Normally we could 
        // use @Stepwise for this, but because @Stepwise implies staying in the same 
        // browser session, it would not work in connection with 
        // 'CachingDriverFactory.clearCacheAndQuitDriver()'. This is the workaround for it. 
        for (FeatureInfo feature : currentSpec.features) 
         feature.executionOrder = feature.declarationOrder 
        } 
    
        def "Search web site Scrum-Master.de"() { 
        setup: 
        def deactivateAutoComplete = 
         "document.getElementById('mod_search_searchword')" + 
         ".setAttribute('autocomplete', 'off')" 
        def regexNumberOfMatches = /Insgesamt wurden ([0-9]+) Ergebnisse gefunden/ 
    
        when: 
        go "https://scrum-master.de" 
        report "welcome page" 
    
        then: 
        $("h2").text().startsWith("Herzlich Willkommen bei Scrum-Master.de") 
    
        when: 
        js.exec(deactivateAutoComplete) 
        $("form").searchword = "Product Owner" + Keys.ENTER 
    
        then: 
        waitFor { $("form#searchForm") } 
    
        when: 
        report "search results" 
        def searchResultSummary = $("form#searchForm").$("table.searchintro").text() 
        def numberOfMatches = (searchResultSummary =~ regexNumberOfMatches)[0][1] as int 
    
        then: 
        numberOfMatches > 0 
    
        cleanup: 
        println "Closing browser and WebDriver" 
        CachingDriverFactory.clearCacheAndQuitDriver() 
        } 
    
        def "Visit Scrum-Master.de download page"() { 
        when: 
        go "https://scrum-master.de/Downloads" 
        report "download page" 
    
        then: 
        $("h2").text().startsWith("Scrum on a Page") 
        } 
    } 
    

    は、私は私のWindows 10マシン上で複数のブラウザで正常にこれをテスト(有効になっているJavaScriptを使用)

  • PhantomJS
  • Chrome
  • Internet Explore R
  • エッジ
  • Firefoxの
+0

CachingDriverFactory.clearCache()を正しく実装する方法の例を挙げてください。私はまだbrowser.close()を使用していますか? browser.quit()?または単にCachingDriverFactory.clearCache()を呼び出してください。 – PMC2013

+0

私は自分の答えを更新しました。 – kriegaex

3

それはあなたの仕様に以下を実行することと同じくらい簡単です:

resetBrowser() 
CachingDriverFactory.clearCacheAndQuitDriver() 

その後browserにアクセスしようとすると任意のコードが新しいWebDriverの自動作成をトリガすると、 Browserインスタンス。

+0

OMG、これはうまくいきました。私はこのような複雑な回避策を使って、Gebの本や他の場所で自分の目を探していました。これを[3.1章または3.2章](http://www.gebish.org/manual/current/#driver-management)に追加して、ライフサイクル管理について話してください。 'resetBrowser()'はBoG全体で一度も言及されておらず、 'clearCacheAndQuitDriver()'との組み合わせについては言及していません。これをBoGに記録することは本当に役に立ちます。 'resetBrowser()'も[JavaDoc](http://www.gebish.org/manual/current/api/geb/spock/GebSpec.html#resetBrowser())には記載されていません。 – kriegaex

+0

いいえ、私はまったく気にしません。 PRやトラッカーの問題は大歓迎です。 – erdi

+0

完了、[チケット](https://github.com/geb/issues/issues/473)を作成しました。 – kriegaex

関連する問題