Skip to content

Commit a6fa040

Browse files
anna-shchurokglibas
authored andcommitted
Bugfix 39 (#40)
* Unwrapping EventFiringWebDriver * Fix not making screenshot on RemoteWebDriver * Fixes #39. Review fixes
1 parent d61cc59 commit a6fa040

File tree

1 file changed

+25
-15
lines changed
  • src/main/java/com/assertthat/selenium_shutterbug/utils/web

1 file changed

+25
-15
lines changed

src/main/java/com/assertthat/selenium_shutterbug/utils/web/Browser.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.openqa.selenium.remote.RemoteWebDriver;
1717
import org.openqa.selenium.remote.Response;
1818
import org.openqa.selenium.remote.http.HttpMethod;
19+
import org.openqa.selenium.support.events.EventFiringWebDriver;
1920

2021
import javax.imageio.ImageIO;
2122
import java.awt.*;
@@ -61,14 +62,7 @@ public Browser(WebDriver driver, boolean useDevicePixelRatio) {
6162
this.devicePixelRatio = devicePixelRatio instanceof Double? (Double)devicePixelRatio: (Long)devicePixelRatio*1.0;
6263
}
6364
}
64-
public Browser(ChromeDriver driver) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
65-
this.driver = driver;
66-
CommandInfo cmd = new CommandInfo("/session/:sessionId/chromium/send_command_and_get_result", HttpMethod.POST);
67-
Method defineCommand = HttpCommandExecutor.class.getDeclaredMethod("defineCommand", String.class, CommandInfo.class);
68-
defineCommand.setAccessible(true);
69-
defineCommand.invoke(driver.getCommandExecutor(), "sendCommand", cmd);
70-
}
71-
65+
7266
public Double getDevicePixelRatio() {
7367
return devicePixelRatio;
7468
}
@@ -134,12 +128,13 @@ public BufferedImage takeScreenshotEntirePage() {
134128
}
135129

136130
public BufferedImage takeScreenshotEntirePageUsingChromeCommand() {
137-
if(!(this.driver instanceof ChromeDriver))
138-
throw new UnsupportedOperationException("You must use Chrome driver for this operation");
131+
this.driver = getDriverAfterValidation(this.driver);
139132

140-
Browser driver;
141133
try {
142-
driver = new Browser((ChromeDriver) this.driver);
134+
CommandInfo cmd = new CommandInfo("/session/:sessionId/chromium/send_command_and_get_result", HttpMethod.POST);
135+
Method defineCommand = HttpCommandExecutor.class.getDeclaredMethod("defineCommand", String.class, CommandInfo.class);
136+
defineCommand.setAccessible(true);
137+
defineCommand.invoke(((RemoteWebDriver) this.driver).getCommandExecutor(), "sendCommand", cmd);
143138
} catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
144139
throw new RuntimeException(e);
145140
}
@@ -149,9 +144,9 @@ public BufferedImage takeScreenshotEntirePageUsingChromeCommand() {
149144
this.scrollTo(0, j * this.getViewportHeight());
150145
wait(scrollTimeout);
151146
}
152-
Object metrics = driver.evaluate(FileUtil.getJsScript(ALL_METRICS));
153-
driver.sendCommand("Emulation.setDeviceMetricsOverride", metrics);
154-
Object result = driver.sendCommand("Page.captureScreenshot", ImmutableMap.of("format", "png", "fromSurface", true));
147+
Object metrics = this.evaluate(FileUtil.getJsScript(ALL_METRICS));
148+
this.sendCommand("Emulation.setDeviceMetricsOverride", metrics);
149+
Object result = this.sendCommand("Page.captureScreenshot", ImmutableMap.of("format", "png", "fromSurface", true));
155150
String base64EncodedPng = (String) ((Map<String, ?>) result).get("data");
156151
InputStream in = new ByteArrayInputStream(OutputType.BYTES.convertFromBase64Png(base64EncodedPng));
157152
BufferedImage bImageFromConvert;
@@ -163,6 +158,21 @@ public BufferedImage takeScreenshotEntirePageUsingChromeCommand() {
163158
return bImageFromConvert;
164159
}
165160

161+
private RemoteWebDriver getDriverAfterValidation(WebDriver driver) {
162+
if (driver instanceof EventFiringWebDriver) {
163+
driver = ((EventFiringWebDriver) this.driver).getWrappedDriver();
164+
}
165+
166+
if (driver instanceof ChromeDriver) {
167+
return (ChromeDriver) driver;
168+
} else if (driver instanceof RemoteWebDriver) {
169+
if (((RemoteWebDriver) driver).getCapabilities().getBrowserName().equals("chrome")) {
170+
return (RemoteWebDriver) driver;
171+
}
172+
}
173+
throw new UnsupportedOperationException("ScrollStrategy.WHOLE_PAGE_CHROME is only applicable for Chrome driver");
174+
}
175+
166176
public BufferedImage takeScreenshotScrollHorizontally() {
167177
BufferedImage combinedImage = new BufferedImage(this.getDocWidth(), this.getViewportHeight(), BufferedImage.TYPE_INT_ARGB);
168178
Graphics2D g = combinedImage.createGraphics();

0 commit comments

Comments
 (0)