From 7ac4131f26a7a9943badf79fbdb575cfc101000b Mon Sep 17 00:00:00 2001 From: iFatRain Date: Mon, 10 Mar 2025 14:14:36 -0500 Subject: [PATCH 1/8] Swap check for Widget and WebElement - Allows Widget extensions to implement WebElement interface --- .../appium/java_client/pagefactory/AppiumFieldDecorator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java index 05fa41a42..82b9c036d 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java +++ b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java @@ -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 From 116d7106389ad61cdef99e315db8623b1fcaba3a Mon Sep 17 00:00:00 2001 From: iFatRain Date: Wed, 23 Apr 2025 16:07:11 -0500 Subject: [PATCH 2/8] Changes DefaultStubWidget to implement+delegate WebElement & adds assertion in test case to verify Widgets are instances of WebElement --- .../widget/tests/DefaultStubWidget.java | 80 ++++++++++++++++++- .../tests/combined/CombinedAppTest.java | 4 + 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java index 5977646d7..6495e5e21 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java @@ -1,11 +1,12 @@ package io.appium.java_client.pagefactory_tests.widget.tests; import io.appium.java_client.pagefactory.Widget; -import org.openqa.selenium.WebElement; +import org.jspecify.annotations.Nullable; +import org.openqa.selenium.*; import java.util.List; -public class DefaultStubWidget extends Widget { +public class DefaultStubWidget extends Widget implements WebElement { protected DefaultStubWidget(WebElement element) { super(element); } @@ -22,4 +23,79 @@ public List 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 getScreenshotAs(OutputType target) throws WebDriverException { + return getWrappedElement().getScreenshotAs(target); + } } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java index c3ee905fb..06d3646e7 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java @@ -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; @@ -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().getClass(), + Matchers.instanceOf(WebElement.class)); List> classes = app.getWidgets().stream().map(abstractWidget -> abstractWidget .getSelfReference().getClass()) From 402ac3d5e84af11a7dcd4324130e27904b138920 Mon Sep 17 00:00:00 2001 From: iFatRain Date: Wed, 23 Apr 2025 16:18:11 -0500 Subject: [PATCH 3/8] Adds default element test case to verify elements are not initialized as widgets with AppiumFieldDecorator --- .../DesktopBrowserCompatibilityTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java index 40c672ae7..67bc2b744 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java @@ -18,10 +18,7 @@ import io.appium.java_client.TestUtils; import io.appium.java_client.android.AndroidDriver; -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.iOSXCUITFindBy; +import io.appium.java_client.pagefactory.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.WebDriver; @@ -37,8 +34,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.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; public class DesktopBrowserCompatibilityTest { private static final String HELLO_APPIUM_HTML = @@ -69,6 +65,7 @@ public class DesktopBrowserCompatibilityTest { assertNotEquals(0, main.size()); assertNull(trap1); assertNull(trap2); + foundLinks.forEach(element -> assertFalse(Widget.class.isAssignableFrom(element.getClass()))); } finally { driver.quit(); } From 98dbcbb6861e5db519402c1dee88afd1a274cc88 Mon Sep 17 00:00:00 2001 From: iFatRain Date: Thu, 24 Apr 2025 08:44:13 -0500 Subject: [PATCH 4/8] Fixing silly oversights in test changes --- .../pagefactory_tests/DesktopBrowserCompatibilityTest.java | 4 +++- .../widget/tests/combined/CombinedAppTest.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java index 67bc2b744..31068bc8e 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java @@ -34,7 +34,9 @@ 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.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class DesktopBrowserCompatibilityTest { private static final String HELLO_APPIUM_HTML = diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java index 06d3646e7..c7e50ef5f 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedAppTest.java @@ -60,7 +60,7 @@ void checkThatWidgetsAreCreatedCorrectly(AbstractApp app, WebDriver driver, assertThat("Expected widget class was " + widgetClass.getName(), app.getWidget().getSelfReference().getClass(), equalTo(widgetClass)); - assertThat(app.getWidget().getSelfReference().getClass(), + assertThat(app.getWidget().getSelfReference(), Matchers.instanceOf(WebElement.class)); List> classes = app.getWidgets().stream().map(abstractWidget -> abstractWidget From 4c0ffd59dd622c9f82ef07a0edcf2234f7b43699 Mon Sep 17 00:00:00 2001 From: iFatRain Date: Thu, 24 Apr 2025 10:49:25 -0500 Subject: [PATCH 5/8] Removing more wildcard imports; IDE doing me dirty --- .../pagefactory_tests/DesktopBrowserCompatibilityTest.java | 6 +++++- .../pagefactory_tests/widget/tests/DefaultStubWidget.java | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java index 31068bc8e..8b544bb9d 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java @@ -18,7 +18,11 @@ import io.appium.java_client.TestUtils; import io.appium.java_client.android.AndroidDriver; -import io.appium.java_client.pagefactory.*; +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.iOSXCUITFindBy; +import io.appium.java_client.pagefactory.Widget; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.WebDriver; diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java index 6495e5e21..0e6224217 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java @@ -2,7 +2,12 @@ import io.appium.java_client.pagefactory.Widget; import org.jspecify.annotations.Nullable; -import org.openqa.selenium.*; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.Point; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.WebDriverException; import java.util.List; From fd46a7511568c36a89e09576aed4acfeafa48708 Mon Sep 17 00:00:00 2001 From: iFatRain Date: Thu, 24 Apr 2025 11:14:58 -0500 Subject: [PATCH 6/8] Reordering imports based on recent build errors --- .../pagefactory_tests/DesktopBrowserCompatibilityTest.java | 2 +- .../pagefactory_tests/widget/tests/DefaultStubWidget.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java index 8b544bb9d..911fefc02 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/DesktopBrowserCompatibilityTest.java @@ -21,8 +21,8 @@ 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.iOSXCUITFindBy; 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; import org.openqa.selenium.WebDriver; diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java index 0e6224217..97adb61f8 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java @@ -2,12 +2,12 @@ import io.appium.java_client.pagefactory.Widget; import org.jspecify.annotations.Nullable; -import org.openqa.selenium.WebElement; import org.openqa.selenium.Point; import org.openqa.selenium.Dimension; import org.openqa.selenium.Rectangle; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; import java.util.List; From e374d60f9c733dafbe045ceab09dfa89eb564c8e Mon Sep 17 00:00:00 2001 From: Valery Yatsynovich Date: Fri, 25 Apr 2025 22:48:51 +0300 Subject: [PATCH 7/8] Fix import order --- .../pagefactory_tests/widget/tests/DefaultStubWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java index 97adb61f8..ef77b7c85 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java @@ -2,10 +2,10 @@ import io.appium.java_client.pagefactory.Widget; import org.jspecify.annotations.Nullable; -import org.openqa.selenium.Point; import org.openqa.selenium.Dimension; -import org.openqa.selenium.Rectangle; +import org.openqa.selenium.Point; import org.openqa.selenium.OutputType; +import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; From 709f5be75d661f6759ed281f44dfaecd35c5e801 Mon Sep 17 00:00:00 2001 From: Valery Yatsynovich Date: Fri, 25 Apr 2025 22:53:58 +0300 Subject: [PATCH 8/8] Fix import order --- .../pagefactory_tests/widget/tests/DefaultStubWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java index ef77b7c85..7de8cf327 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/DefaultStubWidget.java @@ -3,8 +3,8 @@ import io.appium.java_client.pagefactory.Widget; import org.jspecify.annotations.Nullable; import org.openqa.selenium.Dimension; -import org.openqa.selenium.Point; 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;