1616import org .openqa .selenium .remote .RemoteWebDriver ;
1717import org .openqa .selenium .remote .Response ;
1818import org .openqa .selenium .remote .http .HttpMethod ;
19+ import org .openqa .selenium .support .events .EventFiringWebDriver ;
1920
2021import javax .imageio .ImageIO ;
2122import 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