1

Я использую этот класс крюка с селеном и огурцом. Когда я запускаю функцию, запускаются 2 экземпляра, что является проблемой, и экземпляр не закрывается. они бегут от этого крючка ... что я делаю неправильно?Selenium не закрывает браузер, запускает дважды

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 каждый раз. И поскольку ваш крючок (и оба метода обработчика) может потенциально вызваться более одного раза (характер огурца), вы можете получить все большее число экземпляров драйвера.

Что вы должны сделать, это:

  1. Либо обеспечить ваши @After вызовов .quit() каждый раз, чтобы они соответствовали вашему @Before.
  2. Или, более эффективно, изменить ваш @Before только создать драйвер, если один необходим:

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

... и удалить .quit() вообще из @After. Смените ответственность за отказ от общего экземпляра ChromeDriver до уровня, либо к вашему тестовому бегуннику (который мы не видим), либо, возможно, создадим для этого завершающий крючок. Это нужно будет сделать в какой-то момент, иначе процесс браузера не прекратится.

+0

Создайте крюк выключения. at_exit do driver.quit() конец – MikeJRamsey56

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