Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,8 @@ protected boolean isDecoratableList(Field field) {
* @return a field value or null.
*/
public Object decorate(ClassLoader ignored, Field field) {
Object result = defaultElementFieldDecorator.decorate(ignored, field);
return result == null ? decorateWidget(field) : result;
Object result = decorateWidget(field);
return result == null ? defaultElementFieldDecorator.decorate(ignored, field) : result;
}

@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import io.appium.java_client.pagefactory.HowToUseLocators;
import io.appium.java_client.pagefactory.Widget;
import io.appium.java_client.pagefactory.iOSXCUITFindBy;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
Expand All @@ -37,6 +38,7 @@
import static io.appium.java_client.pagefactory.LocatorGroupStrategy.ALL_POSSIBLE;
import static io.github.bonigarcia.wdm.WebDriverManager.chromedriver;
import static java.time.Duration.ofSeconds;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

Expand Down Expand Up @@ -69,6 +71,7 @@ public class DesktopBrowserCompatibilityTest {
assertNotEquals(0, main.size());
assertNull(trap1);
assertNull(trap2);
foundLinks.forEach(element -> assertFalse(Widget.class.isAssignableFrom(element.getClass())));
} finally {
driver.quit();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package io.appium.java_client.pagefactory_tests.widget.tests;

import io.appium.java_client.pagefactory.Widget;
import org.jspecify.annotations.Nullable;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;

import java.util.List;

public class DefaultStubWidget extends Widget {
public class DefaultStubWidget extends Widget implements WebElement {
protected DefaultStubWidget(WebElement element) {
super(element);
}
Expand All @@ -22,4 +28,79 @@ public <T extends Widget> List<T> getSubWidgets() {
public String toString() {
return getWrappedElement().toString();
}

@Override
public void click() {
getWrappedElement().click();
}

@Override
public void submit() {
getWrappedElement().submit();
}

@Override
public void sendKeys(CharSequence... keysToSend) {
getWrappedElement().sendKeys(keysToSend);
}

@Override
public void clear() {
getWrappedElement().clear();
}

@Override
public String getTagName() {
return getWrappedElement().getTagName();
}

@Override
public @Nullable String getAttribute(String name) {
return getWrappedElement().getAttribute(name);
}

@Override
public boolean isSelected() {
return getWrappedElement().isSelected();
}

@Override
public boolean isEnabled() {
return getWrappedElement().isEnabled();
}

@Override
public String getText() {
return getWrappedElement().getText();
}

@Override
public boolean isDisplayed() {
return getWrappedElement().isDisplayed();
}

@Override
public Point getLocation() {
return getWrappedElement().getLocation();
}

@Override
public Dimension getSize() {
return getWrappedElement().getSize();
}

@Override
public Rectangle getRect() {
return getWrappedElement().getRect();
}

@Override
public String getCssValue(String propertyName) {
return getWrappedElement().getCssValue(propertyName);
}

@Override
public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {
return getWrappedElement().getScreenshotAs(target);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import io.appium.java_client.pagefactory_tests.widget.tests.AbstractStubWebDriver;
import io.appium.java_client.pagefactory_tests.widget.tests.DefaultStubWidget;
import io.appium.java_client.pagefactory_tests.widget.tests.android.DefaultAndroidWidget;
import org.hamcrest.Matchers;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.List;
import java.util.stream.Stream;
Expand Down Expand Up @@ -58,6 +60,8 @@ void checkThatWidgetsAreCreatedCorrectly(AbstractApp app, WebDriver driver,
assertThat("Expected widget class was " + widgetClass.getName(),
app.getWidget().getSelfReference().getClass(),
equalTo(widgetClass));
assertThat(app.getWidget().getSelfReference(),
Matchers.instanceOf(WebElement.class));

List<Class<?>> classes = app.getWidgets().stream().map(abstractWidget -> abstractWidget
.getSelfReference().getClass())
Expand Down