Code to open chrome in headless:
public class ChromeDriverFactory {
public ThreadLocal<WebDriver> driver;
private Set<WebDriver> drivers = Collections.newSetFromMap(new ConcurrentHashMap<>());
public ChromeDriverFactory(Boolean isHeadless) throws IOException
{
System.setProperty("webdriver.chrome.driver", TestUtils.getRelativePath() + "/externalLibraries/browsers/chromedriver");
System.setProperty("java.awt.headless", Boolean.toString(isHeadless));
DesiredCapabilities caps = DesiredCapabilities.chrome();
caps.setJavascriptEnabled(true);
caps.setCapability("takesScreenshot", true);
ChromeOptions options = new ChromeOptions();
if (isHeadless)
{
options.addArguments("headless");
options.addArguments("disable-gpu");
//options.addArguments("no-sandbox");
}
options.addArguments("disable-extensions");
caps.setCapability(ChromeOptions.CAPABILITY, options);
driver = new InheritableThreadLocal<WebDriver>(){
@Override
protected ChromeDriver initialValue() {
ChromeDriver chromeDriver = new ChromeDriver(caps);
drivers.add(chromeDriver);
return chromeDriver;
}
};
}
}
Method I'm using to switch to a new window when clicking on a link:
public void switchToNewWindow()
{
try
{
for (String window : LocalDriverManager.getDriver().getWindowHandles())
{
LocalDriverManager.getDriver().switchTo().window(window);
}
}
catch (WebDriverException ex)
{
throw ex;
}
}
Code I am using to take a screencap:
WebDriver _driver = new Augmenter().augment(driver);
File source = ((TakesScreenshot)_driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(source, new File(screenshotPath), true);
Errors that appear in the console when I force quit the stalled test:
[223.906][SEVERE]: Unable to receive message from renderer [223.906][WARNING]: screenshot failed, retrying
Chrome version: 60.0.3112.24, Selenium Version: 3.4.0, Chromedriver version: 2.30, OS: Mac, OS version: Sierra 10.12.5
Steps to reproduce:
Open the browser in headless mode.
Execute some step (i.e clicking a link) that opens a page in a new tab.
Switch focus to the new page in the newly open tab via selenium.
Take a screenshot via selenium.
Expected Result: The screenshot should be taken of the newly opened tab.
Actual Result: The browser hangs indefinitely until manually force quit. And no screencap is taken. Note: This issue does not occur when the --headless flag is removed.
Info about my setup:
(Session info: headless chrome=60.0.3112.40)
(Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.11.6 x86_64)
@Singleton
class BrowserInstance {
ChromeDriver getDriver(){
ChromeOptions options = new ChromeOptions()
options.addArguments("--headless --disable-gpu")
return new ChromeDriver(options)
}
}
2) Use Close and quit in finally block
finally {
chromeDriver.close()
chromeDriver.quit()
}
Result: you will be using only one instance at time and if you see task manager you will not find chromedriver and chrome process hanging.