Skip to content

Commit e571f89

Browse files
committed
[dotnet] Support assembly: Make IWebDriver extension methods handle wrapped drivers
1 parent 5f20319 commit e571f89

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

dotnet/src/support/Extensions/WebDriverExtensions.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)