2016-03-10 48 views
1

我用這個鉤類與硒和黃瓜。當我運行一個功能2實例啓動時,這是一個問題,實例也不會關閉。他們正在從這個鉤子跑..我做錯了什麼?硒不關閉瀏覽器,啓動兩次

public class WebDriverHooks { 
    public static WebDriver driver; 

    @Before 
    /** 
    * Delete all cookies at the start of each scenario to avoid 
    * shared state between tests 
    */ 
    public void openBrowser() throws MalformedURLException { 
     System.out.println("Called openBrowser"); 
     System.setProperty("webdriver.chrome.driver", "//Applications//chrome//chromedriver"); 

     driver = new ChromeDriver(); 
     driver.manage().deleteAllCookies(); 
     driver.manage().window().maximize(); 
    } 

    @After 
    /** 
    * Embed a screenshot in test report if test is marked as failed 
    */ 
    public void embedScreenshot(Scenario scenario) { 
     if (scenario.isFailed()) { 
      try { 
       scenario.write("Current Page URL is " + driver.getCurrentUrl()); 
       byte[] screenshot = getScreenshotAs(OutputType.BYTES); 
       byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES); 
       scenario.embed(screenshot, "image/png"); 
      } catch (WebDriverException somePlatformsDontSupportScreenshots) { 
       System.err.println(somePlatformsDontSupportScreenshots.getMessage()); 
      } 
      driver.quit(); 
     } 
    } 
} 
+0

你的測試在哪裏? – SiKing

回答

0

基本上,你沒有足夠的照顧來管理你的WebDriver實例。

@After處理程序只要求在發生故障時.quit(),而你@Before創建每次新ChromeDriver。而且因爲你的鉤子(和兩個處理器方法)可能會被多次調用(Cucumber的本質),你可能會得到越來越多的Driver實例。

你應該做的是:

  1. 要麼確保您的每一次來電@After.quit(),以符合您@Before
  2. 或者,更有效,改變你的@Before僅當需要一個創建一個驅動程序:

    if (driver == null) { 
        driver = new ChromeDriver(); 
    } 
    

...從@After完全消除.quit()。將負責退出共享ChromeDriver實例的職責轉移到您的測試運行器(我們看不到)或者可能創建一個關閉掛鉤來執行此操作。它需要在某個時候完成,否則瀏覽器進程不會退出。

+0

創建關閉掛鉤。 at_exit do driver.quit() end – MikeJRamsey56