Selenium 没有关闭浏览器,启动两次
Selenium not closing browser, launches twice
我正在将这个钩子 class 与硒和黄瓜一起使用。当我 运行 一个功能 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();
}
}
}
基本上您没有足够小心地管理您的 WebDriver
个实例。
您的 @After
处理程序仅在发生故障时调用 .quit()
,而您的 @Before
每次都会创建一个新的 ChromeDriver
。因为你的钩子(和两个处理程序方法)可能会被调用不止一次(Cucumber 的性质),你可能会得到越来越多的 Driver 实例。
你应该做的是:
- 确保您的
@After
每次都调用 .quit()
,以匹配您的 @Before
。
或者,更有效地,将您的 @Before
更改为仅在需要时创建驱动程序:
if (driver == null) {
driver = new ChromeDriver();
}
... 并从 @After
中完全删除 .quit()
。将退出共享 ChromeDriver
实例的责任上移到您的测试运行程序(我们看不到)或者创建一个关闭挂钩来执行此操作。它需要在某个时候完成,否则浏览器进程不会退出。
我正在将这个钩子 class 与硒和黄瓜一起使用。当我 运行 一个功能 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();
}
}
}
基本上您没有足够小心地管理您的 WebDriver
个实例。
您的 @After
处理程序仅在发生故障时调用 .quit()
,而您的 @Before
每次都会创建一个新的 ChromeDriver
。因为你的钩子(和两个处理程序方法)可能会被调用不止一次(Cucumber 的性质),你可能会得到越来越多的 Driver 实例。
你应该做的是:
- 确保您的
@After
每次都调用.quit()
,以匹配您的@Before
。 或者,更有效地,将您的
@Before
更改为仅在需要时创建驱动程序:if (driver == null) { driver = new ChromeDriver(); }
... 并从 @After
中完全删除 .quit()
。将退出共享 ChromeDriver
实例的责任上移到您的测试运行程序(我们看不到)或者创建一个关闭挂钩来执行此操作。它需要在某个时候完成,否则浏览器进程不会退出。