2017-02-06 5 views
0

Geb 및 Spock Framework를 사용하여 브라우저 세션 중간 테스트를 다시 시작하고 싶습니다. 나는 브라우저를 닫고 테스트 컴 플리 션 (test 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분 : 후속 질문에 대한 감사합니다. 글쎄, 내 간단한 대답은 명령이 한 기능 메서드에서 발행되고 다음 기능 메서드는 새 브라우저 세션에서 시작된다고 가정하여 작성되었습니다. 이 중간 테스트를 수행하려면 수동으로 새로운 WebDriver 인스턴스를 만들어야하고 Geb를 속여 브라우저 세션을 업데이트해야합니다.

최소한 까다로 우며이를 수행하는 방법을 모르므로 브라우저를 종료하기 전후에 테스트해야 할 두 가지 기능 방법을 사용하는 것이 좋습니다. 필요한 경우 @Shared 회원을 통해 그들 사이의 상태를 공유 할 수 있습니다. 또한 Geb에서 새로운 WebDriver 및 브라우저 세션을 만들도록 설정하면 브라우저 유형 및 기능과 같이 GebConfig.groovy에 구성된 모든 항목이 자동으로 고려된다는 이점이있었습니다. 수동으로 드라이버를 만들려면 직접 Geb 구성을 구문 분석해야합니다 - 못생긴!

그러나이 방법의 주요 문제점은 다음과 같습니다. 피처 메소드가 선언의 (어휘) 순서로 실행되는 것을 보장하는 방법은 무엇입니까? 일반적으로 테스트는 순서에 관계없이 실행 가능해야하므로 특정 실행 순서에 의존해서는 안되며 의존해서도 안됩니다. Spock은 실행 순서를 적용하려는 드문 경우를 처리하기 위해 Stepwise 주석을 제공하지만 Geb는 암시 적으로 동일한 세션에서 테스트를 계속해야한다고 가정하기 때문에 중간 테스트 상황과 동일한 문제가 발생할 수 있습니다. 나는. @Stepwise을 사용하지 않고 어휘 실행 순서를 시행하는 트릭이 필요합니다.

또 다른 문제는 스크린 샷을 찍기 때문에 사양이 GebReportingSpec으로 확장되면 Geb는 브라우저가 사라진 상태에서 기능 메서드가 끝날 때 마지막 스크린 샷을 찍지 못하는 것입니다. 이제는 reportOnTestFailureOnly을 통해 테스트가 성공하면 Geh이 스크린 샷을 찍지 않도록 구성 할 수 있지만 여전히 테스트가 실패합니다. 그래서 몇 가지 추가 예외 처리를 사용하여 report 메서드에 대한 재정의를 추가했습니다.내 실제 테스트 중 하나에서 파생 된 전체 솔루션은 다음과 같습니다

:

  • HtmlUnit과 : BTW

    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 컴퓨터에 여러 브라우저에서 성공적으로 테스트 (활성화 된 자바 스크립트 사용)

  • PhantomJS
  • 크롬
  • Internet Explore R
  • 에지
  • 파이어 폭스
+0

CachingDriverFactory.clearCache()를 올바르게 구현하는 방법에 대한 예제를 제공 할 수 있습니까? 나는 여전히 browser.close()를 사용해야합니까 browser.quit()? 또는 CachingDriverFactory.clearCache()를 호출하십시오. – PMC2013

+0

내 대답을 업데이트했습니다. – kriegaex

3

그것은 당신의 사양에서 다음을 수행 한 간단합니다 browser에 액세스하려고 코드는 새로운 WebDriver의 자동 생성을 트리거 그 후

resetBrowser() 
CachingDriverFactory.clearCacheAndQuitDriver() 

Browser 인스턴스.

+0

OMG,이 작품과 나는 그런 복잡한 해결 방법을 사용하여 Geb (BoG)의 책과 다른 곳에서 내 눈을 찾아야했다. 이 내용을 [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

아니요, 전혀 신경 쓰지 않을 것입니다. 추적자의 홍보 또는 문제는 환영합니다. – erdi

+0

완료, [티켓] (https://github.com/geb/issues/issues/473)을 생성했습니다. – kriegaex