2015-03-30 63 views
3

我正在Sauce Connect中運行Geb/Spock測試,並且我寧願每測試都有獨特的RemoteWebDriver實例。這樣,Sauce報告將被測試分開,這使診斷故障變得容易。我不擔心(現在)額外的性能開銷,因爲它通過一個RemoteWebDriver實例運行我們所有的Geb測試根本沒有幫助 - 需要很長時間才能將結果與Sauce屏幕截圖/截屏進行協調,並且當發生超時時(這在Sauce Connect的長時間運行作業中很有可能)通常會有一些測試失敗溢出。在每次Geb Spock測試後退出驅動程序

def cleanup() { 
    if (System.getProperty('geb.env')?.contains('sauce')) { 
     setSauceJobStatus() 
     driver.quit() 
    } 
} 

和當然,我創建的設置()方法的新RemoteWebDriver:

我在擴展GebReportingSpec類試過這一點。

使用這種方法,我可以在每次測試中獲得一個獨特的醬汁連接會話,並且所有的結果都在醬料中精美地組織。然而,所有的測試失敗歸因於:

「org.openqa.selenium.remote.SessionNotFoundException:會話ID爲空。調用quit()?後使用WebDriver?

事實證明,在GebReportingSpec清理()方法調用了此方法:

void report(String label = "") { 
    browser.report(ReporterSupport.toTestReportLabel(_gebReportingSpecTestCounter, _gebReportingPerTestCounter++, _gebReportingSpecTestName.methodName, label)) 
} 

會拋出該堆棧跟蹤:

at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:125) 
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572) 
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:622) 
at org.openqa.selenium.remote.RemoteWebDriver.getPageSource(RemoteWebDriver.java:459) 
at geb.report.PageSourceReporter.getPageSource(PageSourceReporter.groovy:42) 
at geb.report.PageSourceReporter.writePageSource(PageSourceReporter.groovy:38) 
at geb.report.PageSourceReporter.writeReport(PageSourceReporter.groovy:29) 
at geb.report.CompositeReporter.writeReport(CompositeReporter.groovy:31) 
at geb.Browser.report(Browser.groovy:788) 
at geb.spock.GebReportingSpec.report(GebReportingSpec.groovy:44) 
at geb.spock.GebReportingSpec.cleanup(GebReportingSpec.groovy:39) 

它假設webdriver的情況下仍然存在當調用GebReportingSpec cleanup()方法時,可以準備報告信息。

所以,我的方法顯然不是「Geb方式」....我想知道是否有人可以告訴我如何正確地創建一個獨特的驅動程序每個Spock測試?

回答

2

不幸的是,你已經達到了GebReportingSpec實現的限制以及Spock的設置和清除方法在繼承層次結構中執行的固定順序。你應該做的是要退出你的瀏覽器,它覆蓋的GebSpec.resetBrowser()代替cleanup()的方法:

void resetBrowser() { 
    def driver = browser.driver 
    super.resetBrowser() 
    if (System.getProperty('geb.env')?.contains('sauce')) { 
     driver.quit() 
    } 
} 

獲取本地參考驅動程序,然後打電話,是因爲調用父類方法將清除瀏覽器的參考超級方法是很重要的,其意味着你將無法在此後獲得驅動程序。

而且,你不應該建立在setup()RemoteWebDriver,但你應該disable driver caching這意味着一個新的驅動程序將每個駕駛員要求(每個瀏覽器創建一個要求駕駛員和每個測試創建一個新的瀏覽器),而不是創建的被緩存的一個被重用。

+0

erdi,謝謝。我幾天前一直在用我自己的解決方案進行滾動(只需在GebReportingSpec中提取代碼並創建我自己修改的「GebReporting」類),但這種方法更直接。 – 2015-04-01 20:34:40

+0

對我來說,這個解決方案只有在我退出驅動程序後調用'CachingDriverFactory.clearCache()'時纔有效,否則隨後的展開特性方法將拋出與上面相同的異常。 – kriegaex 2015-12-22 07:25:45

0

如果您使用browser.quit(),那麼您將得到一個異常,並且測試將失敗。你可以在班級的最開始嘗試下面的代碼片段,它應該工作得很好:

def setup() {  
    browser.config.cacheDriver = false 
    browser.driver = browser.config.driver 
} 

def cleanup() { 
    browser.close() 
} 

乾杯!

+0

感謝您的答案,但我確實嘗試過。它不關閉Sauce會話(根據Sauce文檔,只能由司機關閉關閉),這會導致Sauce在90秒內未收到命令後報告超時錯誤。最後,我決定擴展GebSpec而不是GebReportingSpec,並簡單地從GebReportingSpec中提取相關的代碼。 – 2015-03-30 23:51:07

相關問題