Skip to content

Commit 3e5f9e2

Browse files
authored
feat: Swap check for Widget and WebElement (#2277)
1 parent 5f2bc1a commit 3e5f9e2

File tree

4 files changed

+91
-3
lines changed

4 files changed

+91
-3
lines changed

src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ protected boolean isDecoratableList(Field field) {
193193
* @return a field value or null.
194194
*/
195195
public Object decorate(ClassLoader ignored, Field field) {
196-
Object result = defaultElementFieldDecorator.decorate(ignored, field);
197-
return result == null ? decorateWidget(field) : result;
196+
Object result = decorateWidget(field);
197+
return result == null ? defaultElementFieldDecorator.decorate(ignored, field) : result;
198198
}
199199

200200
@Nullable

src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.appium.java_client.pagefactory.AndroidFindBy;
2222
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
2323
import io.appium.java_client.pagefactory.HowToUseLocators;
24+
import io.appium.java_client.pagefactory.Widget;
2425
import io.appium.java_client.pagefactory.iOSXCUITFindBy;
2526
import org.junit.jupiter.api.BeforeAll;
2627
import org.junit.jupiter.api.Test;
@@ -37,6 +38,7 @@
3738
import static io.appium.java_client.pagefactory.LocatorGroupStrategy.ALL_POSSIBLE;
3839
import static io.github.bonigarcia.wdm.WebDriverManager.chromedriver;
3940
import static java.time.Duration.ofSeconds;
41+
import static org.junit.jupiter.api.Assertions.assertFalse;
4042
import static org.junit.jupiter.api.Assertions.assertNotEquals;
4143
import static org.junit.jupiter.api.Assertions.assertNull;
4244

@@ -69,6 +71,7 @@ public class DesktopBrowserCompatibilityTest {
6971
assertNotEquals(0, main.size());
7072
assertNull(trap1);
7173
assertNull(trap2);
74+
foundLinks.forEach(element -> assertFalse(Widget.class.isAssignableFrom(element.getClass())));
7275
} finally {
7376
driver.quit();
7477
}

src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java

+82-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package io.appium.java_client.pagefactory_tests.widget.tests;
22

33
import io.appium.java_client.pagefactory.Widget;
4+
import org.jspecify.annotations.Nullable;
5+
import org.openqa.selenium.Dimension;
6+
import org.openqa.selenium.OutputType;
7+
import org.openqa.selenium.Point;
8+
import org.openqa.selenium.Rectangle;
9+
import org.openqa.selenium.WebDriverException;
410
import org.openqa.selenium.WebElement;
511

612
import java.util.List;
713

8-
public class DefaultStubWidget extends Widget {
14+
public class DefaultStubWidget extends Widget implements WebElement {
915
protected DefaultStubWidget(WebElement element) {
1016
super(element);
1117
}
@@ -22,4 +28,79 @@ public <T extends Widget> List<T> getSubWidgets() {
2228
public String toString() {
2329
return getWrappedElement().toString();
2430
}
31+
32+
@Override
33+
public void click() {
34+
getWrappedElement().click();
35+
}
36+
37+
@Override
38+
public void submit() {
39+
getWrappedElement().submit();
40+
}
41+
42+
@Override
43+
public void sendKeys(CharSequence... keysToSend) {
44+
getWrappedElement().sendKeys(keysToSend);
45+
}
46+
47+
@Override
48+
public void clear() {
49+
getWrappedElement().clear();
50+
}
51+
52+
@Override
53+
public String getTagName() {
54+
return getWrappedElement().getTagName();
55+
}
56+
57+
@Override
58+
public @Nullable String getAttribute(String name) {
59+
return getWrappedElement().getAttribute(name);
60+
}
61+
62+
@Override
63+
public boolean isSelected() {
64+
return getWrappedElement().isSelected();
65+
}
66+
67+
@Override
68+
public boolean isEnabled() {
69+
return getWrappedElement().isEnabled();
70+
}
71+
72+
@Override
73+
public String getText() {
74+
return getWrappedElement().getText();
75+
}
76+
77+
@Override
78+
public boolean isDisplayed() {
79+
return getWrappedElement().isDisplayed();
80+
}
81+
82+
@Override
83+
public Point getLocation() {
84+
return getWrappedElement().getLocation();
85+
}
86+
87+
@Override
88+
public Dimension getSize() {
89+
return getWrappedElement().getSize();
90+
}
91+
92+
@Override
93+
public Rectangle getRect() {
94+
return getWrappedElement().getRect();
95+
}
96+
97+
@Override
98+
public String getCssValue(String propertyName) {
99+
return getWrappedElement().getCssValue(propertyName);
100+
}
101+
102+
@Override
103+
public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {
104+
return getWrappedElement().getScreenshotAs(target);
105+
}
25106
}

src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import io.appium.java_client.pagefactory_tests.widget.tests.AbstractStubWebDriver;
77
import io.appium.java_client.pagefactory_tests.widget.tests.DefaultStubWidget;
88
import io.appium.java_client.pagefactory_tests.widget.tests.android.DefaultAndroidWidget;
9+
import org.hamcrest.Matchers;
910
import org.junit.jupiter.params.ParameterizedTest;
1011
import org.junit.jupiter.params.provider.Arguments;
1112
import org.junit.jupiter.params.provider.MethodSource;
1213
import org.openqa.selenium.WebDriver;
14+
import org.openqa.selenium.WebElement;
1315

1416
import java.util.List;
1517
import java.util.stream.Stream;
@@ -58,6 +60,8 @@ void checkThatWidgetsAreCreatedCorrectly(AbstractApp app, WebDriver driver,
5860
assertThat("Expected widget class was " + widgetClass.getName(),
5961
app.getWidget().getSelfReference().getClass(),
6062
equalTo(widgetClass));
63+
assertThat(app.getWidget().getSelfReference(),
64+
Matchers.instanceOf(WebElement.class));
6165

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

0 commit comments

Comments
 (0)