fix #762 reconnect to browser

This commit is contained in:
Shinsuke Sugaya 2016-10-27 17:47:50 +09:00
parent ee7682086e
commit 84a39c09c3

View file

@ -39,6 +39,7 @@ import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.phantomjs.PhantomJSDriverService.Builder;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.UnreachableBrowserException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -62,32 +63,40 @@ public class WebDriverGenerator extends BaseThumbnailGenerator {
protected String imageFormatName = "png";
protected long unreachableCheckInterval = 10 * 60 * 1000L;
protected long previousCheckTime = 0;
@PostConstruct
public void init() {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
if (fessConfig.isThumbnailHtmlPhantomjsEnabled() && super.isAvailable()) {
try {
if (webDriver == null) {
if (webDriverCapabilities == null) {
webDriver = new PhantomJSDriver();
} else {
if (webDriverCapabilities instanceof DesiredCapabilities) {
final DesiredCapabilities capabilities = (DesiredCapabilities) webDriverCapabilities;
webDriverCapabilities.asMap().entrySet().stream()
.filter(e -> e.getValue() instanceof String && filePathMap.containsKey(e.getValue().toString()))
.forEach(e -> capabilities.setCapability(e.getKey(), filePathMap.get(e.getValue().toString())));
}
webDriver = new PhantomJSDriver(createDriverService(webDriverCapabilities), webDriverCapabilities);
}
}
webDriver.manage().window().setSize(new Dimension(windowWidth, windowHeight));
} catch (final Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("WebDriver is not available for generating thumbnails.", e);
startWebDriver();
}
}
protected void startWebDriver() {
try {
if (webDriver == null) {
if (webDriverCapabilities == null) {
webDriver = new PhantomJSDriver();
} else {
logger.info("WebDriver is not available for generating thumbnails.");
if (webDriverCapabilities instanceof DesiredCapabilities) {
final DesiredCapabilities capabilities = (DesiredCapabilities) webDriverCapabilities;
webDriverCapabilities.asMap().entrySet().stream()
.filter(e -> e.getValue() instanceof String && filePathMap.containsKey(e.getValue().toString()))
.forEach(e -> capabilities.setCapability(e.getKey(), filePathMap.get(e.getValue().toString())));
}
webDriver = new PhantomJSDriver(createDriverService(webDriverCapabilities), webDriverCapabilities);
}
}
webDriver.manage().window().setSize(new Dimension(windowWidth, windowHeight));
} catch (final Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("WebDriver is not available for generating thumbnails.", e);
} else {
logger.info("WebDriver is not available for generating thumbnails.");
}
}
}
@ -96,6 +105,7 @@ public class WebDriverGenerator extends BaseThumbnailGenerator {
if (webDriver != null) {
synchronized (this) {
webDriver.quit();
webDriver = null;
}
}
}
@ -124,15 +134,27 @@ public class WebDriverGenerator extends BaseThumbnailGenerator {
if (webDriver instanceof TakesScreenshot) {
synchronized (this) {
webDriver.get(url);
final File thumbnail = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
convert(thumbnail, outputFile);
return true;
try {
webDriver.get(url);
final File thumbnail = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
convert(thumbnail, outputFile);
return true;
} catch (UnreachableBrowserException e) {
if (logger.isDebugEnabled()) {
logger.debug("WebDriver is not available.", e);
}
final long now = ComponentUtil.getSystemHelper().getCurrentTimeAsLong();
if (now - previousCheckTime > unreachableCheckInterval) {
destroy();
startWebDriver();
previousCheckTime = now;
}
}
}
} else {
logger.warn("WebDriver is not instance of TakesScreenshot: " + webDriver);
return false;
}
return false;
}
@Override
@ -242,4 +264,8 @@ public class WebDriverGenerator extends BaseThumbnailGenerator {
public void setThumbnailHeight(final int thumbnailHeight) {
this.thumbnailHeight = thumbnailHeight;
}
public void setUnreachableCheckInterval(long unreachableCheckInterval) {
this.unreachableCheckInterval = unreachableCheckInterval;
}
}