@@ -37,7 +37,7 @@ public static class WebDriverExtensions
3737 /// indicate that it cannot take screenshots.</exception>
3838 public static Screenshot TakeScreenshot ( this IWebDriver driver )
3939 {
40- ITakesScreenshot screenshotDriver = driver as ITakesScreenshot ;
40+ ITakesScreenshot screenshotDriver = GetDriverAs < ITakesScreenshot > ( driver ) ;
4141 if ( screenshotDriver == null )
4242 {
4343 IHasCapabilities capabilitiesDriver = driver as IHasCapabilities ;
@@ -115,13 +115,33 @@ public static T ExecuteJavaScript<T>(this IWebDriver driver, string script, para
115115
116116 private static object ExecuteJavaScriptInternal ( IWebDriver driver , string script , object [ ] args )
117117 {
118- IJavaScriptExecutor executor = driver as IJavaScriptExecutor ;
118+ IJavaScriptExecutor executor = GetDriverAs < IJavaScriptExecutor > ( driver ) ;
119119 if ( executor == null )
120120 {
121121 throw new WebDriverException ( "Driver does not implement IJavaScriptExecutor" ) ;
122122 }
123123
124124 return executor . ExecuteScript ( script , args ) ;
125125 }
126+
127+ private static T GetDriverAs < T > ( IWebDriver driver ) where T : class
128+ {
129+ T convertedDriver = driver as T ;
130+ if ( convertedDriver == null )
131+ {
132+ // If the driver doesn't directly implement the desired interface, but does
133+ // implement IWrapsDriver, walk up the hierarchy of wrapped drivers until
134+ // either we find a class that does implement the desired interface, or is
135+ // no longer wrapping a driver.
136+ IWrapsDriver driverWrapper = driver as IWrapsDriver ;
137+ while ( convertedDriver == null && driverWrapper != null )
138+ {
139+ convertedDriver = driverWrapper . WrappedDriver as T ;
140+ driverWrapper = driverWrapper . WrappedDriver as IWrapsDriver ;
141+ }
142+ }
143+
144+ return convertedDriver ;
145+ }
126146 }
127147}
0 commit comments