2013-04-15 2 views
1

Я запускаю сценарий ниже (GebReportingSpec) с GroovyConsole.exe. Он работает правильно в первый раз, когда запущен GroovyConsole. Он открывает FF, запускает сценарий, а затем закрывает FF при выходе из браузера.Последующие обращения к Geb Spock Test из GroovyConsole сбой с UnreachableBrowserException

Однако, когда я запускаю тот же сценарий снова из той же GroovyConsole, я получаю UnreachableBrowserException. Он сначала вызывает setupSpec() метод, а затем вызвать метод go внутри теста, он вызывает cleanupSpec() ...

ГЭБ: 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 

Последующие запуски (Exception):

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 ... return 'org.openqa.selenium.firefox.FirefoxDriver $ 1 $ 1 @ 18a3fe6 ', который не является реализацией WebDriver ' – kodeninja

ответ

2

Геб есть понятие driver caching так, что только одно окно браузера открывается и повторно, и вы попав в проблему с использованием его с отличной консоли. Geb управляет экземплярами драйверов/браузеров для вас, и кеш активен в течение всего срока службы виртуальной машины. Вы получаете сообщение об ошибке, потому что вы вручную выходите из драйвера (что не должно быть сделано, если кеш-драйв включен), и виртуальная машина не была закрыта (в то время как консоль все еще работает между двумя исполнениями), что означает, что браузер управляется с помощью драйвера, извлеченного из кеша, было отключено.

У вас есть два варианта здесь, второй лучше, на мой взгляд:

  • не бросайте водителя - будет открыто одно окно браузера и повторно через последующего выполнения ваших тестов
  • использовать сборки системы, например Gradle (пример проект Геба построен с использованием Gradle является avaialable here) - это выключит виртуальную машину после выполнения теста (ов), и он будет также автоматически отключается браузером
+0

Спасибо @erdi! Я закончил тем, что вы предложили в своем первом варианте. В любом случае, я просто нуждался в нем для демонстрации, поэтому я работал в GroovyConsole. Вы правы в том, что лучший способ запуска этих тестов - это часть системы сборки. Это то, что я планирую делать. Мы скоро переедем в Maven и будем рассматривать возможность интеграции этих тестовых примеров с системой сборки. Сочетание Geb, Spock, Groovy и Selenuim действительно круто! – kodeninja

+0

Я только заметил, что запуск этих сценариев из GroovyConsole вызывает groovyConsole.exe, который все еще находится в памяти даже после закрытия редактора. – kodeninja

Смежные вопросы