Skip to content

Commit

Permalink
unwrap webdriver multiple times if it's deeply wrapped
Browse files Browse the repository at this point in the history
it may happen if someone added multiple listeners to the webdriver
  • Loading branch information
asolntsev committed May 24, 2023
1 parent 64b204b commit 9268276
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public static <T extends AppiumDriver> T getMobileDriver() {
if (isAndroidDriver() || isIosDriver()) {
return isAndroidDriver() ? (T) getAndroidDriver() : (T) getIosDriver();
}
throw new ClassCastException("WebDriver is not instance of AndroidDriver or IOSDriver");
throw new ClassCastException("WebDriver is not instance of AndroidDriver or IOSDriver: " + WebDriverRunner.getWebDriver());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.codeborne.selenide.Driver;
import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WrapsDriver;
import org.openqa.selenium.WrapsElement;
Expand Down Expand Up @@ -35,10 +34,11 @@ public static <T> Optional<T> cast(Driver driver, Class<T> klass) {
return cast(driver.getWebDriver(), klass);
}

public static <T> Optional<T> cast(SearchContext probablyWrappedWebdriver, Class<T> klass) {
WebDriver unwrappedWebdriver = probablyWrappedWebdriver instanceof WrapsDriver ?
((WrapsDriver) probablyWrappedWebdriver).getWrappedDriver() :
(WebDriver) probablyWrappedWebdriver;
public static <T> Optional<T> cast(SearchContext driverOrElement, Class<T> klass) {
SearchContext unwrappedWebdriver = driverOrElement;
while (unwrappedWebdriver instanceof WrapsDriver wrapper) {
unwrappedWebdriver = wrapper.getWrappedDriver();
}

//noinspection unchecked
return klass.isAssignableFrom(unwrappedWebdriver.getClass()) ?
Expand All @@ -47,9 +47,10 @@ public static <T> Optional<T> cast(SearchContext probablyWrappedWebdriver, Class
}

public static <T> T cast(WebElement probablyWrappedWebElement, Class<T> klass) {
WebElement unwrappedWebElement = probablyWrappedWebElement instanceof WrapsElement ?
((WrapsElement) probablyWrappedWebElement).getWrappedElement() :
probablyWrappedWebElement;
WebElement unwrappedWebElement = probablyWrappedWebElement;
while (unwrappedWebElement instanceof WrapsElement wrapper) {
unwrappedWebElement = wrapper.getWrappedElement();
}

if (!klass.isAssignableFrom(unwrappedWebElement.getClass())) {
throw new IllegalArgumentException("WebElement " + unwrappedWebElement + " is not instance of " + klass.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void beforeClickOn(WebElement element, WebDriver driver) {
}
}

private static class ClickListener implements WebDriverListener {
public static class ClickListener implements WebDriverListener {
private static final Logger log = LoggerFactory.getLogger(ClickListener.class);

@Override
Expand Down

0 comments on commit 9268276

Please sign in to comment.