2013-04-15 60 views
1

我在GroovyConsole.exe內運行以下腳本(GebReportingSpec測試用例)。它在GroovyConsole啓動時第一次正常運行。它打開FF,運行場景,然後在退出瀏覽器時關閉FF。隨後從GroovyConsole調用Geb Spock測試失敗,出現UnreachableBrowserException

但是,當我從同一個GroovyConsole再次運行相同的腳本時,我得到一個UnreachableBrowserException。它首先調用setupSpec()方法,然後在調用測試用例內go方法,它調用cleanupSpec() ...

GEB: 0.9.0

: 2.26.0

Groovy的: 2.0.5

FF: 14.0.1

JDK: 1.6.0_37 64位

腳本

@Grapes([ 
    @Grab("org.gebish:geb-core:0.9.0"), 
    @Grab("org.gebish:geb-spock:0.9.0"), 
    @Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.26.0"), 
    //@Grab("org.seleniumhq.selenium:selenium-chrome-driver:2.26.0"), 
    @Grab("org.seleniumhq.selenium:selenium-support:2.26.0") 
]) 
import geb.Browser 
import geb.spock.GebReportingSpec 
import org.openqa.selenium.firefox.* 

class Google_Search_Test extends GebReportingSpec { 
def setupSpec() { 
    println "Inside setupSpec()..." 
    browser.config.autoClearCookies = true 
} 

def cleanupSpec() { 
    println "Inside cleanupSpec()..." 
    println "Quitting browser..." 
    browser.quit() 
} 

def "google_search_wikipedia"() { 
    println "Inside google_search_wikipedia..." 
    when: 
     println "Going to google.com..." 
     go "http://google.com/ncr" 

     // make sure we actually got to the page 
     assert title == "Google" 

     // enter wikipedia into the search field 
     $("input", name: "q").value("wikipedia") 

     // wait for the change to results page to happen 
     // (google updates the page dynamically without a new request) 
     waitFor { title.endsWith("Google Search") } 

     // is the first link to wikipedia? 
     def firstLink = $("li.g", 0).find("a.l") 
    then: 
     firstLink.text() == "Wikipedia" 
     println "Finished test execution..." 

} 
} 

GebConfig.groovy

import org.openqa.selenium.firefox.* 
import java.util.concurrent.* 

driver = { 
    FirefoxProfile firefoxProfile = new FirefoxProfile() 
    firefoxProfile.setPreference("capability.policy.default.Window.frameElement", "allAccess") 

    def driver = new FirefoxDriver(firefoxProfile) 
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS) 
    driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS) 

    driver 
} 

waiting { 
    // all values are in seconds 
    timeout = 60 
    retryInterval = 0.5 
} 

reportsDir = "SeleniumReports" 

成功運行

Inside setupSpec()... 
Inside google_search_wikipedia... 
Going to google.com... 
Finished test execution... 
Inside cleanupSpec()... 
Quitting browser... 
JUnit 4 Runner, Tests: 1, Failures: 0, Time: 15739 

後續運行(例外)

Inside setupSpec()... 
Inside google_search_wikipedia... 
Going to google.com... 
Inside cleanupSpec()... 
Quitting browser... 
JUnit 4 Runner, Tests: 1, Failures: 2, Time: 687 
Test Failure: google_search_wikipedia(Google_Search_Test) 
org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died. 
Build info: version: '2.26.0', revision: '18040', time: '2012-11-02 09:44:45' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_37' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:526) 
    at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:275) 
    at geb.Browser.go(Browser.groovy:371) 
    at geb.Browser.go(Browser.groovy:363) 
    at geb.spock.GebSpec.methodMissing(GebSpec.groovy:51) 
    at Google_Search_Test.google_search_wikipedia(Google_Search.groovy:27) 
Caused by: org.openqa.selenium.WebDriverException: The FirefoxDriver cannot be used after quit() was called. 
Build info: version: '2.26.0', revision: '18040', time: '2012-11-02 09:44:45' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_37' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:351) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:505) 
    ... 5 more 

Test Failure: google_search_wikipedia(Google_Search_Test) 
org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died. 
Build info: version: '2.26.0', revision: '18040', time: '2012-11-02 09:44:45' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_37' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:526) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:535) 
    at org.openqa.selenium.remote.RemoteWebDriver.getPageSource(RemoteWebDriver.java:396) 
    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:698) 
    at geb.spock.GebReportingSpec.report(GebReportingSpec.groovy:43) 
    at geb.spock.GebReportingSpec.cleanup(GebReportingSpec.groovy:39) 
Caused by: org.openqa.selenium.WebDriverException: The FirefoxDriver cannot be used after quit() was called. 
Build info: version: '2.26.0', revision: '18040', time: '2012-11-02 09:44:45' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_37' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:351) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:505) 
    ... 9 more 
+0

你爲什麼需要'司機''driver.manage()。timeouts()。之後'pageLoadTimeout(60,TimeUnit。SECONDS)'在GebConfig.groovy上? – plsgogame

+0

@amisuno,如果我設置超時後沒有返回驅動程序對象,Geb無法創建驅動程序,並且得到異常'DriverCreationException:callback script ... returned'org.openqa.selenium.firefox.FirefoxDriver $ 1 $ 1 @ 18a3fe6'這不是WebDriver實現 ' – kodeninja

回答

2

蓋布具有這樣只有一個瀏覽器窗口打開,並重新使用driver caching一個概念,你從常規控制檯使用它時遇到問題。 Geb爲您管理驅動程序/瀏覽器實例,並且該緩存在VM的整個生命週期中都處於活動狀態。您正在手動退出驅動程序(如果啓用了驅動程序緩存,則不應該這樣做)並且VM尚未關閉(Groovy控制檯仍在兩次執行之間運行),這意味着瀏覽器可以管理從緩存中檢索到的驅動程序已被關閉。

您這裏有兩個選擇,第二次在我看來更好:

  • 不退出的司機 - 一個瀏覽器窗口將在您的測試的後續執行打開和重用
  • 使用一個構建系統,例如Gradle(一個例子蓋布項目中使用搖籃是avaialable內置here) - 這是你的測試(S)執行後會關閉虛擬機,它也將自動關閉瀏覽器
+0

謝謝@erdi!我最終做了你在第一個選項中提出的建議。無論如何,我只需要它進行演示,這就是爲什麼我在GroovyConsole中運行它的原因。你是對的,運行這些測試的更好方式是構建系統的一部分。這也是我計劃要做的。我們很快就會轉向Maven,並將考慮將這些測試用例與構建系統集成在一起。 Geb,Spock,Groovy和Selenuim的組合非常酷! – kodeninja

+0

我剛剛注意到,即使在關閉編輯器後,從GroovyConsole運行這些腳本也會導致groovyConsole.exe仍然在內存中。 – kodeninja

相關問題