From b04522a8682265bbfcfb044690e55f287efee472 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Tue, 16 Jul 2024 19:34:13 +0530 Subject: [PATCH 1/9] feat: Add locator types supported by flutter integration driver --- .../java/io/appium/java_client/AppiumBy.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index cb374831e..aae245b82 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -26,6 +26,9 @@ import java.io.Serializable; import java.util.List; +import java.util.Map; +import java.util.Collections; +import java.util.HashMap; import static com.google.common.base.Strings.isNullOrEmpty; @@ -53,6 +56,13 @@ protected AppiumBy(String selector, String locatorString, String locatorName) { return String.format("%s.%s: %s", AppiumBy.class.getSimpleName(), locatorName, remoteParameters.value()); } + public Map toJson() { + Map params = new HashMap(); + params.put("using", this.remoteParameters.using()); + params.put("value", this.remoteParameters.value()); + return Collections.unmodifiableMap(params); + } + /** * About Android accessibility * https://developer.android.com/intl/ru/training/accessibility/accessible-app.html @@ -186,6 +196,51 @@ public static By iOSNsPredicateString(final String iOSNsPredicateString) { return new ByIosNsPredicate(iOSNsPredicateString); } + /** + * This locator strategy is available in FlutterIntegration Driver mode. + * @param selector is the value defined to the key attribute of the flutter element + * @return an instance of {@link AppiumBy.ByFlutterKey} + */ + public static By flutterKey(final String selector) { + return new ByFlutterKey(selector); + } + + /** + * This locator strategy is available in FlutterIntegration Driver mode. + * @param selector is the Type of widget mounted in the app tree + * @return an instance of {@link AppiumBy.ByFlutterType} + */ + public static By flutterType(final String selector) { + return new ByFlutterType(selector); + } + + /** + * This locator strategy is available in FlutterIntegration Driver mode. + * @param selector is the text that is present on the widget + * @return an instance of {@link AppiumBy.ByFlutterText} + */ + public static By flutterText(final String selector) { + return new ByFlutterText(selector); + } + + /** + * This locator strategy is available in FlutterIntegration Driver mode. + * @param selector is the text that is partially present on the widget + * @return an instance of {@link AppiumBy.ByFlutterTextContaining} + */ + public static By flutterTextContaining(final String selector) { + return new ByFlutterTextContaining(selector); + } + + /** + * This locator strategy is available in FlutterIntegration Driver mode. + * @param semanticsLabel represents the value assigned to the label attribute of semantics element + * @return an instance of {@link AppiumBy.ByFlutterSemanticsLabel} + */ + public static By flutterSemanticsLabel(final String semanticsLabel) { + return new ByFlutterSemanticsLabel(semanticsLabel); + } + public static class ByAccessibilityId extends AppiumBy implements Serializable { public ByAccessibilityId(String accessibilityId) { super("accessibility id", accessibilityId, "accessibilityId"); @@ -257,4 +312,34 @@ protected ByIosNsPredicate(String locatorString) { super("-ios predicate string", locatorString, "iOSNsPredicate"); } } + + public static class ByFlutterType extends AppiumBy implements Serializable { + protected ByFlutterType(String locatorString) { + super("-flutter type", locatorString, "flutterType"); + } + } + + public static class ByFlutterKey extends AppiumBy implements Serializable { + protected ByFlutterKey(String locatorString) { + super("-flutter key", locatorString, "flutterKey"); + } + } + + public static class ByFlutterSemanticsLabel extends AppiumBy implements Serializable { + protected ByFlutterSemanticsLabel(String locatorString) { + super("-flutter semantics label", locatorString, "flutterSemanticsLabel"); + } + } + + public static class ByFlutterText extends AppiumBy implements Serializable { + protected ByFlutterText(String locatorString) { + super("-flutter text", locatorString, "flutterText"); + } + } + + public static class ByFlutterTextContaining extends AppiumBy implements Serializable { + protected ByFlutterTextContaining(String locatorString) { + super("-flutter text containing", locatorString, "flutterTextContaining"); + } + } } From d6314d9466ff952e222564a73badd5fe59c7e439 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 16:42:54 +0530 Subject: [PATCH 2/9] Implement custom flutter drivers for android and ios --- .../java/io/appium/java_client/AppiumBy.java | 82 +++++++---- .../flutter/FlutterAndroidDriver.java | 134 ++++++++++++++++++ .../java_client/flutter/FlutterDriver.java | 22 +++ .../java_client/flutter/FlutterIOSDriver.java | 133 +++++++++++++++++ .../commands/CommonFlutterCommands.java | 94 ++++++++++++ .../flutter/commands/DoubleClickOptions.java | 5 + .../flutter/commands/DragAndDropOptions.java | 28 ++++ .../commands/FlutterCommandOptions.java | 25 ++++ .../commands/FlutterGestureOptions.java | 29 ++++ .../flutter/commands/LongPressOptions.java | 13 ++ .../flutter/commands/ScrollOptions.java | 59 ++++++++ .../flutter/commands/WaitOptions.java | 34 +++++ 12 files changed, 632 insertions(+), 26 deletions(-) create mode 100644 src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java create mode 100644 src/main/java/io/appium/java_client/flutter/FlutterDriver.java create mode 100644 src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java create mode 100644 src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index aae245b82..288b619de 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -25,17 +25,19 @@ import org.openqa.selenium.WebElement; import java.io.Serializable; -import java.util.List; -import java.util.Map; import java.util.Collections; import java.util.HashMap; +import java.util.List; +import java.util.Map; + import static com.google.common.base.Strings.isNullOrEmpty; @EqualsAndHashCode(callSuper = true) public abstract class AppiumBy extends By implements Remotable { - @Getter private final Parameters remoteParameters; + @Getter + private final Parameters remoteParameters; private final String locatorName; protected AppiumBy(String selector, String locatorString, String locatorName) { @@ -44,31 +46,28 @@ protected AppiumBy(String selector, String locatorString, String locatorName) { this.locatorName = locatorName; } - @Override public List findElements(SearchContext context) { + @Override + public List findElements(SearchContext context) { return context.findElements(this); } - @Override public WebElement findElement(SearchContext context) { + @Override + public WebElement findElement(SearchContext context) { return context.findElement(this); } - @Override public String toString() { + @Override + public String toString() { return String.format("%s.%s: %s", AppiumBy.class.getSimpleName(), locatorName, remoteParameters.value()); } - public Map toJson() { - Map params = new HashMap(); - params.put("using", this.remoteParameters.using()); - params.put("value", this.remoteParameters.value()); - return Collections.unmodifiableMap(params); - } - /** * About Android accessibility * https://developer.android.com/intl/ru/training/accessibility/accessible-app.html * About iOS accessibility * https://developer.apple.com/library/ios/documentation/UIKit/Reference/ * UIAccessibilityIdentification_Protocol/index.html + * * @param accessibilityId id is a convenient UI automation accessibility Id. * @return an instance of {@link AppiumBy.ByAndroidUIAutomator} */ @@ -78,9 +77,10 @@ public static By accessibilityId(final String accessibilityId) { /** * This locator strategy is only available in Espresso Driver mode. + * * @param dataMatcherString is a valid json string detailing hamcrest matcher for Espresso onData(). - * See - * the documentation for more details + * See + * the documentation for more details * @return an instance of {@link AppiumBy.ByAndroidDataMatcher} */ public static By androidDataMatcher(final String dataMatcherString) { @@ -89,6 +89,7 @@ public static By androidDataMatcher(final String dataMatcherString) { /** * Refer to https://developer.android.com/training/testing/ui-automator + * * @param uiautomatorText is Android UIAutomator string * @return an instance of {@link AppiumBy.ByAndroidUIAutomator} */ @@ -98,9 +99,10 @@ public static By androidUIAutomator(final String uiautomatorText) { /** * This locator strategy is only available in Espresso Driver mode. + * * @param viewMatcherString is a valid json string detailing hamcrest matcher for Espresso onView(). - * See - * the documentation for more details + * See + * the documentation for more details * @return an instance of {@link AppiumBy.ByAndroidViewMatcher} */ public static By androidViewMatcher(final String viewMatcherString) { @@ -109,9 +111,11 @@ public static By androidViewMatcher(final String viewMatcherString) { /** * This locator strategy is available in Espresso Driver mode. - * @since Appium 1.8.2 beta + * * @param tag is a view tag string * @return an instance of {@link ByAndroidViewTag} + * @since Appium 1.8.2 beta + * @since Appium 1.8.2 beta */ public static By androidViewTag(final String tag) { return new ByAndroidViewTag(tag); @@ -120,6 +124,7 @@ public static By androidViewTag(final String tag) { /** * For IOS it is the full name of the XCUI element and begins with XCUIElementType. * For Android it is the full name of the UIAutomator2 class (e.g.: android.widget.TextView) + * * @param selector the class name of the element * @return an instance of {@link ByClassName} */ @@ -130,6 +135,7 @@ public static By className(final String selector) { /** * For IOS the element name. * For Android it is the resource identifier. + * * @param selector element id * @return an instance of {@link ById} */ @@ -140,6 +146,7 @@ public static By id(final String selector) { /** * For IOS the element name. * For Android it is the resource identifier. + * * @param selector element id * @return an instance of {@link ByName} */ @@ -163,14 +170,14 @@ public static By custom(final String selector) { * This locator strategy is available only if OpenCV libraries and * Node.js bindings are installed on the server machine. * + * @param b64Template base64-encoded template image string. Supported image formats are the same + * as for OpenCV library. + * @return an instance of {@link ByImage} * @see * The documentation on Image Comparison Features * @see * The settings available for lookup fine-tuning * @since Appium 1.8.2 - * @param b64Template base64-encoded template image string. Supported image formats are the same - * as for OpenCV library. - * @return an instance of {@link ByImage} */ public static By image(final String b64Template) { return new ByImage(b64Template); @@ -178,6 +185,7 @@ public static By image(final String b64Template) { /** * This locator strategy is available in XCUITest Driver mode. + * * @param iOSClassChainString is a valid class chain locator string. * See * the documentation for more details @@ -189,6 +197,7 @@ public static By iOSClassChain(final String iOSClassChainString) { /** * This locator strategy is available in XCUITest Driver mode. + * * @param iOSNsPredicateString is an iOS NsPredicate String * @return an instance of {@link AppiumBy.ByIosNsPredicate} */ @@ -198,6 +207,7 @@ public static By iOSNsPredicateString(final String iOSNsPredicateString) { /** * This locator strategy is available in FlutterIntegration Driver mode. + * * @param selector is the value defined to the key attribute of the flutter element * @return an instance of {@link AppiumBy.ByFlutterKey} */ @@ -207,6 +217,7 @@ public static By flutterKey(final String selector) { /** * This locator strategy is available in FlutterIntegration Driver mode. + * * @param selector is the Type of widget mounted in the app tree * @return an instance of {@link AppiumBy.ByFlutterType} */ @@ -216,6 +227,7 @@ public static By flutterType(final String selector) { /** * This locator strategy is available in FlutterIntegration Driver mode. + * * @param selector is the text that is present on the widget * @return an instance of {@link AppiumBy.ByFlutterText} */ @@ -225,6 +237,7 @@ public static By flutterText(final String selector) { /** * This locator strategy is available in FlutterIntegration Driver mode. + * * @param selector is the text that is partially present on the widget * @return an instance of {@link AppiumBy.ByFlutterTextContaining} */ @@ -234,6 +247,7 @@ public static By flutterTextContaining(final String selector) { /** * This locator strategy is available in FlutterIntegration Driver mode. + * * @param semanticsLabel represents the value assigned to the label attribute of semantics element * @return an instance of {@link AppiumBy.ByFlutterSemanticsLabel} */ @@ -313,33 +327,49 @@ protected ByIosNsPredicate(String locatorString) { } } - public static class ByFlutterType extends AppiumBy implements Serializable { + public static class FlutterBy extends AppiumBy { + + protected FlutterBy(String selector, String locatorString, String locatorName) { + super(selector, locatorString, locatorName); + } + + public Map toJson() { + Map params = new HashMap(); + params.put("using", this.getRemoteParameters().using()); + params.put("value", this.getRemoteParameters().value()); + return Collections.unmodifiableMap(params); + } + } + + + public static class ByFlutterType extends FlutterBy implements Serializable { protected ByFlutterType(String locatorString) { super("-flutter type", locatorString, "flutterType"); } } - public static class ByFlutterKey extends AppiumBy implements Serializable { + public static class ByFlutterKey extends FlutterBy implements Serializable { protected ByFlutterKey(String locatorString) { super("-flutter key", locatorString, "flutterKey"); } } - public static class ByFlutterSemanticsLabel extends AppiumBy implements Serializable { + public static class ByFlutterSemanticsLabel extends FlutterBy implements Serializable { protected ByFlutterSemanticsLabel(String locatorString) { super("-flutter semantics label", locatorString, "flutterSemanticsLabel"); } } - public static class ByFlutterText extends AppiumBy implements Serializable { + public static class ByFlutterText extends FlutterBy implements Serializable { protected ByFlutterText(String locatorString) { super("-flutter text", locatorString, "flutterText"); } } - public static class ByFlutterTextContaining extends AppiumBy implements Serializable { + public static class ByFlutterTextContaining extends FlutterBy implements Serializable { protected ByFlutterTextContaining(String locatorString) { super("-flutter text containing", locatorString, "flutterTextContaining"); } } + } diff --git a/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java new file mode 100644 index 000000000..3e6900205 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java @@ -0,0 +1,134 @@ +package io.appium.java_client.flutter; + +import io.appium.java_client.AppiumClientConfig; +import io.appium.java_client.android.AndroidDriver; +import io.appium.java_client.flutter.commands.CommonFlutterCommands; +import io.appium.java_client.flutter.commands.DoubleClickOptions; +import io.appium.java_client.flutter.commands.DragAndDropOptions; +import io.appium.java_client.flutter.commands.LongPressOptions; +import io.appium.java_client.flutter.commands.ScrollOptions; +import io.appium.java_client.flutter.commands.WaitOptions; +import io.appium.java_client.service.local.AppiumDriverLocalService; +import io.appium.java_client.service.local.AppiumServiceBuilder; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.remote.HttpCommandExecutor; +import org.openqa.selenium.remote.http.ClientConfig; +import org.openqa.selenium.remote.http.HttpClient; + +import java.net.URL; + +/** + * Custom AndroidDriver implementation with additional Flutter-specific capabilities. + */ +public class FlutterAndroidDriver extends AndroidDriver implements FlutterDriver { + + public FlutterAndroidDriver(HttpCommandExecutor executor, Capabilities capabilities) { + super(executor, capabilities); + } + + public FlutterAndroidDriver(URL remoteAddress, Capabilities capabilities) { + super(remoteAddress, capabilities); + } + + public FlutterAndroidDriver(URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(remoteAddress, httpClientFactory, capabilities); + } + + public FlutterAndroidDriver(AppiumDriverLocalService service, Capabilities capabilities) { + super(service, capabilities); + } + + public FlutterAndroidDriver( + AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(service, httpClientFactory, capabilities); + } + + public FlutterAndroidDriver(AppiumServiceBuilder builder, Capabilities capabilities) { + super(builder, capabilities); + } + + public FlutterAndroidDriver( + AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(builder, httpClientFactory, capabilities); + } + + public FlutterAndroidDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(httpClientFactory, capabilities); + } + + public FlutterAndroidDriver(ClientConfig clientConfig, Capabilities capabilities) { + super(clientConfig, capabilities); + } + + public FlutterAndroidDriver(AppiumClientConfig appiumClientConfig, Capabilities capabilities) { + super(appiumClientConfig, capabilities); + } + + public FlutterAndroidDriver(Capabilities capabilities) { + super(capabilities); + } + + public FlutterAndroidDriver(URL remoteSessionAddress, String automationName) { + super(remoteSessionAddress, automationName); + } + + /** + * Waits for an element to become visible on the Flutter application. + * + * @param option WaitOptions specifying the element and optional timeout. + */ + @Override + public void waitForVisible(WaitOptions option) { + CommonFlutterCommands.waitForVisible(this, option); + } + + /** + * Waits for an element to become invisible on the Flutter application. + * + * @param option WaitOptions specifying the element and optional timeout. + */ + @Override + public void waitForInVisible(WaitOptions option) { + CommonFlutterCommands.waitForInVisible(this, option); + } + + /** + * Scrolls to make an element visible on the Flutter application. + * + * @param option ScrollOptions specifying the finder and scroll direction. + */ + @Override + public void scrollTillVisible(ScrollOptions option) { + CommonFlutterCommands.scrollTillVisible(this, option); + } + + /** + * Performs a double click on an element in the Flutter application. + * + * @param option DoubleClickOptions specifying the element to double-click. + */ + @Override + public void performDoubleClick(DoubleClickOptions option) { + CommonFlutterCommands.performDoubleClick(this, option); + } + + /** + * Performs a long press on an element in the Flutter application. + * + * @param option LongPressOptions specifying the element to long-press. + */ + @Override + public void performLongPress(LongPressOptions option) { + CommonFlutterCommands.performLongPress(this, option); + } + + /** + * Performs a drag-and-drop operation between two elements in the Flutter application. + * + * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. + */ + @Override + public void performDragAndDrop(DragAndDropOptions option) { + CommonFlutterCommands.performDragAndDrop(this, option); + } +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/FlutterDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterDriver.java new file mode 100644 index 000000000..999839014 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/FlutterDriver.java @@ -0,0 +1,22 @@ +package io.appium.java_client.flutter; + + +import io.appium.java_client.flutter.commands.DoubleClickOptions; +import io.appium.java_client.flutter.commands.DragAndDropOptions; +import io.appium.java_client.flutter.commands.LongPressOptions; +import io.appium.java_client.flutter.commands.ScrollOptions; +import io.appium.java_client.flutter.commands.WaitOptions; + +public interface FlutterDriver { + void waitForVisible(WaitOptions option); + + void waitForInVisible(WaitOptions option); + + void scrollTillVisible(ScrollOptions option); + + void performDoubleClick(DoubleClickOptions option); + + void performLongPress(LongPressOptions option); + + void performDragAndDrop(DragAndDropOptions option); +} diff --git a/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java new file mode 100644 index 000000000..250415713 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java @@ -0,0 +1,133 @@ +package io.appium.java_client.flutter; + +import io.appium.java_client.AppiumClientConfig; +import io.appium.java_client.flutter.commands.CommonFlutterCommands; +import io.appium.java_client.flutter.commands.DoubleClickOptions; +import io.appium.java_client.flutter.commands.DragAndDropOptions; +import io.appium.java_client.flutter.commands.LongPressOptions; +import io.appium.java_client.flutter.commands.ScrollOptions; +import io.appium.java_client.flutter.commands.WaitOptions; +import io.appium.java_client.ios.IOSDriver; +import io.appium.java_client.service.local.AppiumDriverLocalService; +import io.appium.java_client.service.local.AppiumServiceBuilder; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.remote.HttpCommandExecutor; +import org.openqa.selenium.remote.http.ClientConfig; +import org.openqa.selenium.remote.http.HttpClient; + +import java.net.URL; + +/** + * Custom AndroidDriver implementation with additional Flutter-specific capabilities. + */ +public class FlutterIOSDriver extends IOSDriver implements FlutterDriver { + + public FlutterIOSDriver(HttpCommandExecutor executor, Capabilities capabilities) { + super(executor, capabilities); + } + + public FlutterIOSDriver(URL remoteAddress, Capabilities capabilities) { + super(remoteAddress, capabilities); + } + + public FlutterIOSDriver(URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(remoteAddress, httpClientFactory, capabilities); + } + + public FlutterIOSDriver(AppiumDriverLocalService service, Capabilities capabilities) { + super(service, capabilities); + } + + public FlutterIOSDriver( + AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(service, httpClientFactory, capabilities); + } + + public FlutterIOSDriver(AppiumServiceBuilder builder, Capabilities capabilities) { + super(builder, capabilities); + } + + public FlutterIOSDriver( + AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(builder, httpClientFactory, capabilities); + } + + public FlutterIOSDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) { + super(httpClientFactory, capabilities); + } + + public FlutterIOSDriver(ClientConfig clientConfig, Capabilities capabilities) { + super(clientConfig, capabilities); + } + + public FlutterIOSDriver(AppiumClientConfig appiumClientConfig, Capabilities capabilities) { + super(appiumClientConfig, capabilities); + } + + public FlutterIOSDriver(URL remoteSessionAddress) { + super(remoteSessionAddress); + } + + public FlutterIOSDriver(Capabilities capabilities) { + super(capabilities); + } + + /** + * Waits for an element to become visible on the Flutter application. + * + * @param option WaitOptions specifying the element and optional timeout. + */ + public void waitForVisible(WaitOptions option) { + CommonFlutterCommands.waitForVisible(this, option); + } + + /** + * Waits for an element to become invisible on the Flutter application. + * + * @param option WaitOptions specifying the element and optional timeout. + */ + @Override + public void waitForInVisible(WaitOptions option) { + CommonFlutterCommands.waitForInVisible(this, option); + } + + /** + * Scrolls to make an element visible on the Flutter application. + * + * @param option ScrollOptions specifying the finder and scroll direction. + */ + @Override + public void scrollTillVisible(ScrollOptions option) { + CommonFlutterCommands.scrollTillVisible(this, option); + } + + /** + * Performs a double click on an element in the Flutter application. + * + * @param option DoubleClickOptions specifying the element to double-click. + */ + @Override + public void performDoubleClick(DoubleClickOptions option) { + CommonFlutterCommands.performDoubleClick(this, option); + } + + /** + * Performs a long press on an element in the Flutter application. + * + * @param option LongPressOptions specifying the element to long-press. + */ + @Override + public void performLongPress(LongPressOptions option) { + CommonFlutterCommands.performLongPress(this, option); + } + + /** + * Performs a drag-and-drop operation between two elements in the Flutter application. + * + * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. + */ + @Override + public void performDragAndDrop(DragAndDropOptions option) { + CommonFlutterCommands.performDragAndDrop(this, option); + } +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java b/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java new file mode 100644 index 000000000..a37a551cd --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java @@ -0,0 +1,94 @@ +package io.appium.java_client.flutter.commands; + +import io.appium.java_client.flutter.FlutterDriver; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class CommonFlutterCommands { + + private static final String FLUTTER_COMMAND_PREFIX = "flutter"; + private static final String WAIT_FOR_VISIBLE_COMMAND = "waitForVisible"; + private static final String WAIT_FOR_INVISIBLE_COMMAND = "waitForAbsent"; + private static final String SCROLL_TILL_VISIBLE = "scrollTillVisible"; + private static final String DOUBLE_CLICK = "doubleClick"; + private static final String LONG_PRESS = "longPress"; + private static final String DRAG_AND_DROP = "dragAndDrop"; + + private CommonFlutterCommands() { + } + + /** + * Waits for an element to become visible on the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option WaitOptions specifying the element and optional timeout. + */ + public static void waitForVisible(FlutterDriver driver, WaitOptions option) { + executeScript(driver, WAIT_FOR_VISIBLE_COMMAND, option); + } + + /** + * Waits for an element to become invisible on the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option WaitOptions specifying the element and optional timeout. + */ + public static void waitForInVisible(FlutterDriver driver, WaitOptions option) { + executeScript(driver, WAIT_FOR_INVISIBLE_COMMAND, option); + } + + /** + * Scrolls to make an element visible on the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option ScrollOptions specifying the finder and scroll direction. + * @return WebElement that was scrolled to and made visible. + */ + public static WebElement scrollTillVisible(FlutterDriver driver, ScrollOptions option) { + return (WebElement) executeScript(driver, SCROLL_TILL_VISIBLE, option); + } + + /** + * Performs a double click on an element in the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option DoubleClickOptions specifying the element to double-click. + */ + public static void performDoubleClick(FlutterDriver driver, DoubleClickOptions option) { + executeScript(driver, DOUBLE_CLICK, option); + } + + /** + * Performs a long press on an element in the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option LongPressOptions specifying the element to long-press. + */ + public static void performLongPress(FlutterDriver driver, LongPressOptions option) { + executeScript(driver, LONG_PRESS, option); + } + + /** + * Performs a drag-and-drop operation between two elements in the Flutter application. + * + * @param driver WebDriver instance to execute the command on. + * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. + */ + public static void performDragAndDrop(FlutterDriver driver, DragAndDropOptions option) { + executeScript(driver, DRAG_AND_DROP, option); + } + + /** + * Executes a Flutter command using JavaScriptExecutor. + * + * @param driver WebDriver instance to execute the command on. + * @param scriptName Name of the Flutter command script. + * @param args FlutterCommandOptions containing the command arguments. + * @return Object returned by the JavaScript execution. + */ + public static Object executeScript(FlutterDriver driver, String scriptName, FlutterCommandOptions args) { + String commandName = String.format("%s: %s", FLUTTER_COMMAND_PREFIX, scriptName); + return ((JavascriptExecutor) driver).executeScript(commandName, args.toJson()); + } +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java new file mode 100644 index 000000000..311b6b05d --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java @@ -0,0 +1,5 @@ +package io.appium.java_client.flutter.commands; + +public class DoubleClickOptions extends FlutterGestureOptions { + +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java new file mode 100644 index 000000000..d6df695e3 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java @@ -0,0 +1,28 @@ +package io.appium.java_client.flutter.commands; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; +import org.openqa.selenium.WebElement; + +import java.util.Map; + +@Accessors(chain = true) +@Getter +@AllArgsConstructor +public class DragAndDropOptions implements FlutterCommandOptions { + @NonNull + WebElement source; + @NonNull + WebElement target; + + private DragAndDropOptions() { + } + + @Override + public Map toJson() { + return Map.of("source", source, "target", target); + } +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java new file mode 100644 index 000000000..7223e5972 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java @@ -0,0 +1,25 @@ +package io.appium.java_client.flutter.commands; + +import io.appium.java_client.AppiumBy; +import org.openqa.selenium.By; + +import java.util.Map; + +public interface FlutterCommandOptions { + /** + * Parses an {@link AppiumBy.FlutterBy} object into a Map of parameters + * to be executed by flutter integration driver. + * + * @param by The {@link AppiumBy.FlutterBy} object to parse. + * @return A {@link Map} containing the parsed parameters + */ + default Map parseBy(AppiumBy.FlutterBy by) { + By.Remotable.Parameters parameters = by.getRemoteParameters(); + return Map.of( + "using", parameters.using(), + "value", parameters.value() + ); + } + + Map toJson(); +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java new file mode 100644 index 000000000..52be2a390 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java @@ -0,0 +1,29 @@ +package io.appium.java_client.flutter.commands; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.openqa.selenium.Point; +import org.openqa.selenium.WebElement; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true) +@Getter +@Setter +public class FlutterGestureOptions implements FlutterCommandOptions { + WebElement element; + Point point; + + @Override + public Map toJson() { + Map args = new HashMap<>(); + args.put("origin", element); + if (point != null) { + args.put("offset", Map.of("x", point.x, "y", point.y)); + } + return Collections.unmodifiableMap(args); + } +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java b/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java new file mode 100644 index 000000000..ab7cf08da --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java @@ -0,0 +1,13 @@ +package io.appium.java_client.flutter.commands; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + + +@Accessors(chain = true) +@Setter +@Getter +public class LongPressOptions extends FlutterGestureOptions { + +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java new file mode 100644 index 000000000..701e11aa2 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java @@ -0,0 +1,59 @@ +package io.appium.java_client.flutter.commands; + +import io.appium.java_client.AppiumBy; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.openqa.selenium.WebElement; + +import java.time.Duration; +import java.util.Map; +import java.util.Optional; + +@Accessors(chain = true) +@Getter +@Setter +public class ScrollOptions implements FlutterCommandOptions { + AppiumBy.FlutterBy scrollTo; + WebElement scrollView; + ScrollDirection scrollDirection; + Integer delta; + Integer maxScrolls; + Integer settleBetweenScrollsTimeout; + Duration dragDuration; + + private ScrollOptions() { + } + + public ScrollOptions(AppiumBy.FlutterBy scrollTo, ScrollDirection scrollDirection) { + this.scrollTo = scrollTo; + this.scrollDirection = scrollDirection; + } + + @Override + public Map toJson() { + return Map.of( + "finder", scrollTo != null ? parseBy(scrollTo) : null, + "scrollView", scrollView, + "delta", delta, + "maxScrolls", maxScrolls, + "settleBetweenScrollsTimeout", settleBetweenScrollsTimeout, + "scrollDirection", Optional.ofNullable(scrollDirection).orElse(ScrollDirection.UP).getDirection(), + "dragDuration", Optional.ofNullable(dragDuration).orElse(Duration.ZERO).getSeconds() + ); + } + + @Getter + public static enum ScrollDirection { + UP("up"), + RIGHT("right"), + DOWN("down"), + LEFT("left"); + + private final String direction; + + ScrollDirection(String direction) { + this.direction = direction; + } + } +} \ No newline at end of file diff --git a/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java b/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java new file mode 100644 index 000000000..327b529d4 --- /dev/null +++ b/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java @@ -0,0 +1,34 @@ +package io.appium.java_client.flutter.commands; + +import io.appium.java_client.AppiumBy; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.openqa.selenium.WebElement; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Accessors(chain = true) +@Getter +@Setter +public class WaitOptions implements FlutterCommandOptions { + private WebElement element; + private AppiumBy.FlutterBy locator; + private Duration timeout; + + @Override + public Map toJson() { + Map args = new HashMap<>(); + args.put("element", element); + if (locator != null) { + args.put("locator", locator.toJson()); + } + if (timeout != null) { + args.put("timeout", timeout.getSeconds()); + } + return Collections.unmodifiableMap(args); + } +} \ No newline at end of file From cfd4ced6bc42a215b7968ca05b764e12d59d9d15 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 16:54:06 +0530 Subject: [PATCH 3/9] checkStyle fixes --- .../java/io/appium/java_client/AppiumBy.java | 16 ++++++++++------ .../commands/CommonFlutterCommands.java | 1 - .../flutter/commands/DragAndDropOptions.java | 1 - .../commands/FlutterCommandOptions.java | 18 ------------------ .../flutter/commands/ScrollOptions.java | 2 +- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index 288b619de..bfe094ed3 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -25,8 +25,6 @@ import org.openqa.selenium.WebElement; import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -333,11 +331,17 @@ protected FlutterBy(String selector, String locatorString, String locatorName) { super(selector, locatorString, locatorName); } + /** + * Parses an {@link AppiumBy.FlutterBy} object into a Map of parameters + * to be executed by flutter integration driver. + * + * @return A {@link Map} containing the parsed parameters + */ public Map toJson() { - Map params = new HashMap(); - params.put("using", this.getRemoteParameters().using()); - params.put("value", this.getRemoteParameters().value()); - return Collections.unmodifiableMap(params); + return Map.of( + "using", this.getRemoteParameters().using(), + "value", this.getRemoteParameters().value() + ); } } diff --git a/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java b/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java index a37a551cd..95c51c827 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java +++ b/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java @@ -2,7 +2,6 @@ import io.appium.java_client.flutter.FlutterDriver; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; public class CommonFlutterCommands { diff --git a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java index d6df695e3..eaeb63281 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java @@ -3,7 +3,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NonNull; -import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; import org.openqa.selenium.WebElement; diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java index 7223e5972..c4c77885b 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java @@ -1,25 +1,7 @@ package io.appium.java_client.flutter.commands; -import io.appium.java_client.AppiumBy; -import org.openqa.selenium.By; - import java.util.Map; public interface FlutterCommandOptions { - /** - * Parses an {@link AppiumBy.FlutterBy} object into a Map of parameters - * to be executed by flutter integration driver. - * - * @param by The {@link AppiumBy.FlutterBy} object to parse. - * @return A {@link Map} containing the parsed parameters - */ - default Map parseBy(AppiumBy.FlutterBy by) { - By.Remotable.Parameters parameters = by.getRemoteParameters(); - return Map.of( - "using", parameters.using(), - "value", parameters.value() - ); - } - Map toJson(); } diff --git a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java index 701e11aa2..4292c1397 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java @@ -33,7 +33,7 @@ public ScrollOptions(AppiumBy.FlutterBy scrollTo, ScrollDirection scrollDirectio @Override public Map toJson() { return Map.of( - "finder", scrollTo != null ? parseBy(scrollTo) : null, + "finder", scrollTo != null ? scrollTo.toJson() : null, "scrollView", scrollView, "delta", delta, "maxScrolls", maxScrolls, From 7ae569c6a1ba0ffa9c56d8b54a6163694b260677 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 17:02:06 +0530 Subject: [PATCH 4/9] Minor tweaks --- src/main/java/io/appium/java_client/AppiumBy.java | 1 - .../java_client/flutter/FlutterAndroidDriver.java | 2 +- .../java_client/flutter/FlutterIOSDriver.java | 2 +- .../flutter/commands/DoubleClickOptions.java | 2 +- .../flutter/commands/DragAndDropOptions.java | 2 +- .../flutter/commands/LongPressOptions.java | 2 +- .../flutter/commands/ScrollOptions.java | 15 +++++++++++---- .../java_client/flutter/commands/WaitOptions.java | 2 +- 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index bfe094ed3..d560967ef 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -113,7 +113,6 @@ public static By androidViewMatcher(final String viewMatcherString) { * @param tag is a view tag string * @return an instance of {@link ByAndroidViewTag} * @since Appium 1.8.2 beta - * @since Appium 1.8.2 beta */ public static By androidViewTag(final String tag) { return new ByAndroidViewTag(tag); diff --git a/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java index 3e6900205..d1b3f04d1 100644 --- a/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java +++ b/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java @@ -131,4 +131,4 @@ public void performLongPress(LongPressOptions option) { public void performDragAndDrop(DragAndDropOptions option) { CommonFlutterCommands.performDragAndDrop(this, option); } -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java index 250415713..d76d81bbc 100644 --- a/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java +++ b/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java @@ -130,4 +130,4 @@ public void performLongPress(LongPressOptions option) { public void performDragAndDrop(DragAndDropOptions option) { CommonFlutterCommands.performDragAndDrop(this, option); } -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java index 311b6b05d..809e831f1 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java @@ -2,4 +2,4 @@ public class DoubleClickOptions extends FlutterGestureOptions { -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java index eaeb63281..aecd55238 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java @@ -24,4 +24,4 @@ private DragAndDropOptions() { public Map toJson() { return Map.of("source", source, "target", target); } -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java b/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java index ab7cf08da..798054fa9 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java @@ -10,4 +10,4 @@ @Getter public class LongPressOptions extends FlutterGestureOptions { -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java index 4292c1397..1667d721a 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java @@ -1,7 +1,9 @@ package io.appium.java_client.flutter.commands; +import com.google.common.base.Preconditions; import io.appium.java_client.AppiumBy; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import lombok.experimental.Accessors; import org.openqa.selenium.WebElement; @@ -10,6 +12,8 @@ import java.util.Map; import java.util.Optional; +import static com.google.common.base.Strings.isNullOrEmpty; + @Accessors(chain = true) @Getter @Setter @@ -26,6 +30,7 @@ private ScrollOptions() { } public ScrollOptions(AppiumBy.FlutterBy scrollTo, ScrollDirection scrollDirection) { + Preconditions.checkArgument(scrollTo != null, "Must supply a valid locator for scrollTo"); this.scrollTo = scrollTo; this.scrollDirection = scrollDirection; } @@ -33,13 +38,15 @@ public ScrollOptions(AppiumBy.FlutterBy scrollTo, ScrollDirection scrollDirectio @Override public Map toJson() { return Map.of( - "finder", scrollTo != null ? scrollTo.toJson() : null, + "finder", scrollTo.toJson(), "scrollView", scrollView, "delta", delta, "maxScrolls", maxScrolls, "settleBetweenScrollsTimeout", settleBetweenScrollsTimeout, - "scrollDirection", Optional.ofNullable(scrollDirection).orElse(ScrollDirection.UP).getDirection(), - "dragDuration", Optional.ofNullable(dragDuration).orElse(Duration.ZERO).getSeconds() + "scrollDirection", Optional.ofNullable(scrollDirection) + .orElse(ScrollDirection.UP).getDirection(), + "dragDuration", Optional.ofNullable(dragDuration) + .orElse(Duration.ZERO).getSeconds() ); } @@ -56,4 +63,4 @@ public static enum ScrollDirection { this.direction = direction; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java b/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java index 327b529d4..a3aaa3cd5 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java @@ -31,4 +31,4 @@ public Map toJson() { } return Collections.unmodifiableMap(args); } -} \ No newline at end of file +} From d4b7f635c63e291f79b86ca2576fedc55ab56889 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 17:04:07 +0530 Subject: [PATCH 5/9] improvements --- .../java_client/flutter/commands/FlutterGestureOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java index 52be2a390..b4ea5205b 100644 --- a/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java +++ b/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java @@ -22,7 +22,7 @@ public Map toJson() { Map args = new HashMap<>(); args.put("origin", element); if (point != null) { - args.put("offset", Map.of("x", point.x, "y", point.y)); + args.put("offset", Map.of("x", point.getX(), "y", point.getY())); } return Collections.unmodifiableMap(args); } From f7a6e43d7def18c2ce3b9a5784180393625a97e2 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 21:30:55 +0530 Subject: [PATCH 6/9] Remove driver implementation --- .../flutter/FlutterAndroidDriver.java | 134 ------------------ .../java_client/flutter/FlutterDriver.java | 22 --- .../java_client/flutter/FlutterIOSDriver.java | 133 ----------------- .../commands/CommonFlutterCommands.java | 93 ------------ .../flutter/commands/DoubleClickOptions.java | 5 - .../flutter/commands/DragAndDropOptions.java | 27 ---- .../commands/FlutterCommandOptions.java | 7 - .../commands/FlutterGestureOptions.java | 29 ---- .../flutter/commands/LongPressOptions.java | 13 -- .../flutter/commands/ScrollOptions.java | 66 --------- .../flutter/commands/WaitOptions.java | 34 ----- 11 files changed, 563 deletions(-) delete mode 100644 src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java delete mode 100644 src/main/java/io/appium/java_client/flutter/FlutterDriver.java delete mode 100644 src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java delete mode 100644 src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java diff --git a/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java deleted file mode 100644 index d1b3f04d1..000000000 --- a/src/main/java/io/appium/java_client/flutter/FlutterAndroidDriver.java +++ /dev/null @@ -1,134 +0,0 @@ -package io.appium.java_client.flutter; - -import io.appium.java_client.AppiumClientConfig; -import io.appium.java_client.android.AndroidDriver; -import io.appium.java_client.flutter.commands.CommonFlutterCommands; -import io.appium.java_client.flutter.commands.DoubleClickOptions; -import io.appium.java_client.flutter.commands.DragAndDropOptions; -import io.appium.java_client.flutter.commands.LongPressOptions; -import io.appium.java_client.flutter.commands.ScrollOptions; -import io.appium.java_client.flutter.commands.WaitOptions; -import io.appium.java_client.service.local.AppiumDriverLocalService; -import io.appium.java_client.service.local.AppiumServiceBuilder; -import org.openqa.selenium.Capabilities; -import org.openqa.selenium.remote.HttpCommandExecutor; -import org.openqa.selenium.remote.http.ClientConfig; -import org.openqa.selenium.remote.http.HttpClient; - -import java.net.URL; - -/** - * Custom AndroidDriver implementation with additional Flutter-specific capabilities. - */ -public class FlutterAndroidDriver extends AndroidDriver implements FlutterDriver { - - public FlutterAndroidDriver(HttpCommandExecutor executor, Capabilities capabilities) { - super(executor, capabilities); - } - - public FlutterAndroidDriver(URL remoteAddress, Capabilities capabilities) { - super(remoteAddress, capabilities); - } - - public FlutterAndroidDriver(URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(remoteAddress, httpClientFactory, capabilities); - } - - public FlutterAndroidDriver(AppiumDriverLocalService service, Capabilities capabilities) { - super(service, capabilities); - } - - public FlutterAndroidDriver( - AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(service, httpClientFactory, capabilities); - } - - public FlutterAndroidDriver(AppiumServiceBuilder builder, Capabilities capabilities) { - super(builder, capabilities); - } - - public FlutterAndroidDriver( - AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(builder, httpClientFactory, capabilities); - } - - public FlutterAndroidDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(httpClientFactory, capabilities); - } - - public FlutterAndroidDriver(ClientConfig clientConfig, Capabilities capabilities) { - super(clientConfig, capabilities); - } - - public FlutterAndroidDriver(AppiumClientConfig appiumClientConfig, Capabilities capabilities) { - super(appiumClientConfig, capabilities); - } - - public FlutterAndroidDriver(Capabilities capabilities) { - super(capabilities); - } - - public FlutterAndroidDriver(URL remoteSessionAddress, String automationName) { - super(remoteSessionAddress, automationName); - } - - /** - * Waits for an element to become visible on the Flutter application. - * - * @param option WaitOptions specifying the element and optional timeout. - */ - @Override - public void waitForVisible(WaitOptions option) { - CommonFlutterCommands.waitForVisible(this, option); - } - - /** - * Waits for an element to become invisible on the Flutter application. - * - * @param option WaitOptions specifying the element and optional timeout. - */ - @Override - public void waitForInVisible(WaitOptions option) { - CommonFlutterCommands.waitForInVisible(this, option); - } - - /** - * Scrolls to make an element visible on the Flutter application. - * - * @param option ScrollOptions specifying the finder and scroll direction. - */ - @Override - public void scrollTillVisible(ScrollOptions option) { - CommonFlutterCommands.scrollTillVisible(this, option); - } - - /** - * Performs a double click on an element in the Flutter application. - * - * @param option DoubleClickOptions specifying the element to double-click. - */ - @Override - public void performDoubleClick(DoubleClickOptions option) { - CommonFlutterCommands.performDoubleClick(this, option); - } - - /** - * Performs a long press on an element in the Flutter application. - * - * @param option LongPressOptions specifying the element to long-press. - */ - @Override - public void performLongPress(LongPressOptions option) { - CommonFlutterCommands.performLongPress(this, option); - } - - /** - * Performs a drag-and-drop operation between two elements in the Flutter application. - * - * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. - */ - @Override - public void performDragAndDrop(DragAndDropOptions option) { - CommonFlutterCommands.performDragAndDrop(this, option); - } -} diff --git a/src/main/java/io/appium/java_client/flutter/FlutterDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterDriver.java deleted file mode 100644 index 999839014..000000000 --- a/src/main/java/io/appium/java_client/flutter/FlutterDriver.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.appium.java_client.flutter; - - -import io.appium.java_client.flutter.commands.DoubleClickOptions; -import io.appium.java_client.flutter.commands.DragAndDropOptions; -import io.appium.java_client.flutter.commands.LongPressOptions; -import io.appium.java_client.flutter.commands.ScrollOptions; -import io.appium.java_client.flutter.commands.WaitOptions; - -public interface FlutterDriver { - void waitForVisible(WaitOptions option); - - void waitForInVisible(WaitOptions option); - - void scrollTillVisible(ScrollOptions option); - - void performDoubleClick(DoubleClickOptions option); - - void performLongPress(LongPressOptions option); - - void performDragAndDrop(DragAndDropOptions option); -} diff --git a/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java b/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java deleted file mode 100644 index d76d81bbc..000000000 --- a/src/main/java/io/appium/java_client/flutter/FlutterIOSDriver.java +++ /dev/null @@ -1,133 +0,0 @@ -package io.appium.java_client.flutter; - -import io.appium.java_client.AppiumClientConfig; -import io.appium.java_client.flutter.commands.CommonFlutterCommands; -import io.appium.java_client.flutter.commands.DoubleClickOptions; -import io.appium.java_client.flutter.commands.DragAndDropOptions; -import io.appium.java_client.flutter.commands.LongPressOptions; -import io.appium.java_client.flutter.commands.ScrollOptions; -import io.appium.java_client.flutter.commands.WaitOptions; -import io.appium.java_client.ios.IOSDriver; -import io.appium.java_client.service.local.AppiumDriverLocalService; -import io.appium.java_client.service.local.AppiumServiceBuilder; -import org.openqa.selenium.Capabilities; -import org.openqa.selenium.remote.HttpCommandExecutor; -import org.openqa.selenium.remote.http.ClientConfig; -import org.openqa.selenium.remote.http.HttpClient; - -import java.net.URL; - -/** - * Custom AndroidDriver implementation with additional Flutter-specific capabilities. - */ -public class FlutterIOSDriver extends IOSDriver implements FlutterDriver { - - public FlutterIOSDriver(HttpCommandExecutor executor, Capabilities capabilities) { - super(executor, capabilities); - } - - public FlutterIOSDriver(URL remoteAddress, Capabilities capabilities) { - super(remoteAddress, capabilities); - } - - public FlutterIOSDriver(URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(remoteAddress, httpClientFactory, capabilities); - } - - public FlutterIOSDriver(AppiumDriverLocalService service, Capabilities capabilities) { - super(service, capabilities); - } - - public FlutterIOSDriver( - AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(service, httpClientFactory, capabilities); - } - - public FlutterIOSDriver(AppiumServiceBuilder builder, Capabilities capabilities) { - super(builder, capabilities); - } - - public FlutterIOSDriver( - AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(builder, httpClientFactory, capabilities); - } - - public FlutterIOSDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) { - super(httpClientFactory, capabilities); - } - - public FlutterIOSDriver(ClientConfig clientConfig, Capabilities capabilities) { - super(clientConfig, capabilities); - } - - public FlutterIOSDriver(AppiumClientConfig appiumClientConfig, Capabilities capabilities) { - super(appiumClientConfig, capabilities); - } - - public FlutterIOSDriver(URL remoteSessionAddress) { - super(remoteSessionAddress); - } - - public FlutterIOSDriver(Capabilities capabilities) { - super(capabilities); - } - - /** - * Waits for an element to become visible on the Flutter application. - * - * @param option WaitOptions specifying the element and optional timeout. - */ - public void waitForVisible(WaitOptions option) { - CommonFlutterCommands.waitForVisible(this, option); - } - - /** - * Waits for an element to become invisible on the Flutter application. - * - * @param option WaitOptions specifying the element and optional timeout. - */ - @Override - public void waitForInVisible(WaitOptions option) { - CommonFlutterCommands.waitForInVisible(this, option); - } - - /** - * Scrolls to make an element visible on the Flutter application. - * - * @param option ScrollOptions specifying the finder and scroll direction. - */ - @Override - public void scrollTillVisible(ScrollOptions option) { - CommonFlutterCommands.scrollTillVisible(this, option); - } - - /** - * Performs a double click on an element in the Flutter application. - * - * @param option DoubleClickOptions specifying the element to double-click. - */ - @Override - public void performDoubleClick(DoubleClickOptions option) { - CommonFlutterCommands.performDoubleClick(this, option); - } - - /** - * Performs a long press on an element in the Flutter application. - * - * @param option LongPressOptions specifying the element to long-press. - */ - @Override - public void performLongPress(LongPressOptions option) { - CommonFlutterCommands.performLongPress(this, option); - } - - /** - * Performs a drag-and-drop operation between two elements in the Flutter application. - * - * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. - */ - @Override - public void performDragAndDrop(DragAndDropOptions option) { - CommonFlutterCommands.performDragAndDrop(this, option); - } -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java b/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java deleted file mode 100644 index 95c51c827..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/CommonFlutterCommands.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import io.appium.java_client.flutter.FlutterDriver; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebElement; - -public class CommonFlutterCommands { - - private static final String FLUTTER_COMMAND_PREFIX = "flutter"; - private static final String WAIT_FOR_VISIBLE_COMMAND = "waitForVisible"; - private static final String WAIT_FOR_INVISIBLE_COMMAND = "waitForAbsent"; - private static final String SCROLL_TILL_VISIBLE = "scrollTillVisible"; - private static final String DOUBLE_CLICK = "doubleClick"; - private static final String LONG_PRESS = "longPress"; - private static final String DRAG_AND_DROP = "dragAndDrop"; - - private CommonFlutterCommands() { - } - - /** - * Waits for an element to become visible on the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option WaitOptions specifying the element and optional timeout. - */ - public static void waitForVisible(FlutterDriver driver, WaitOptions option) { - executeScript(driver, WAIT_FOR_VISIBLE_COMMAND, option); - } - - /** - * Waits for an element to become invisible on the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option WaitOptions specifying the element and optional timeout. - */ - public static void waitForInVisible(FlutterDriver driver, WaitOptions option) { - executeScript(driver, WAIT_FOR_INVISIBLE_COMMAND, option); - } - - /** - * Scrolls to make an element visible on the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option ScrollOptions specifying the finder and scroll direction. - * @return WebElement that was scrolled to and made visible. - */ - public static WebElement scrollTillVisible(FlutterDriver driver, ScrollOptions option) { - return (WebElement) executeScript(driver, SCROLL_TILL_VISIBLE, option); - } - - /** - * Performs a double click on an element in the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option DoubleClickOptions specifying the element to double-click. - */ - public static void performDoubleClick(FlutterDriver driver, DoubleClickOptions option) { - executeScript(driver, DOUBLE_CLICK, option); - } - - /** - * Performs a long press on an element in the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option LongPressOptions specifying the element to long-press. - */ - public static void performLongPress(FlutterDriver driver, LongPressOptions option) { - executeScript(driver, LONG_PRESS, option); - } - - /** - * Performs a drag-and-drop operation between two elements in the Flutter application. - * - * @param driver WebDriver instance to execute the command on. - * @param option DragAndDropOptions specifying the source and target elements for the drag-and-drop operation. - */ - public static void performDragAndDrop(FlutterDriver driver, DragAndDropOptions option) { - executeScript(driver, DRAG_AND_DROP, option); - } - - /** - * Executes a Flutter command using JavaScriptExecutor. - * - * @param driver WebDriver instance to execute the command on. - * @param scriptName Name of the Flutter command script. - * @param args FlutterCommandOptions containing the command arguments. - * @return Object returned by the JavaScript execution. - */ - public static Object executeScript(FlutterDriver driver, String scriptName, FlutterCommandOptions args) { - String commandName = String.format("%s: %s", FLUTTER_COMMAND_PREFIX, scriptName); - return ((JavascriptExecutor) driver).executeScript(commandName, args.toJson()); - } -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java deleted file mode 100644 index 809e831f1..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/DoubleClickOptions.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.appium.java_client.flutter.commands; - -public class DoubleClickOptions extends FlutterGestureOptions { - -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java b/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java deleted file mode 100644 index aecd55238..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/DragAndDropOptions.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NonNull; -import lombok.experimental.Accessors; -import org.openqa.selenium.WebElement; - -import java.util.Map; - -@Accessors(chain = true) -@Getter -@AllArgsConstructor -public class DragAndDropOptions implements FlutterCommandOptions { - @NonNull - WebElement source; - @NonNull - WebElement target; - - private DragAndDropOptions() { - } - - @Override - public Map toJson() { - return Map.of("source", source, "target", target); - } -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java deleted file mode 100644 index c4c77885b..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/FlutterCommandOptions.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import java.util.Map; - -public interface FlutterCommandOptions { - Map toJson(); -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java b/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java deleted file mode 100644 index b4ea5205b..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/FlutterGestureOptions.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.openqa.selenium.Point; -import org.openqa.selenium.WebElement; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -@Accessors(chain = true) -@Getter -@Setter -public class FlutterGestureOptions implements FlutterCommandOptions { - WebElement element; - Point point; - - @Override - public Map toJson() { - Map args = new HashMap<>(); - args.put("origin", element); - if (point != null) { - args.put("offset", Map.of("x", point.getX(), "y", point.getY())); - } - return Collections.unmodifiableMap(args); - } -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java b/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java deleted file mode 100644 index 798054fa9..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/LongPressOptions.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - - -@Accessors(chain = true) -@Setter -@Getter -public class LongPressOptions extends FlutterGestureOptions { - -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java b/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java deleted file mode 100644 index 1667d721a..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/ScrollOptions.java +++ /dev/null @@ -1,66 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import com.google.common.base.Preconditions; -import io.appium.java_client.AppiumBy; -import lombok.Getter; -import lombok.NonNull; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.openqa.selenium.WebElement; - -import java.time.Duration; -import java.util.Map; -import java.util.Optional; - -import static com.google.common.base.Strings.isNullOrEmpty; - -@Accessors(chain = true) -@Getter -@Setter -public class ScrollOptions implements FlutterCommandOptions { - AppiumBy.FlutterBy scrollTo; - WebElement scrollView; - ScrollDirection scrollDirection; - Integer delta; - Integer maxScrolls; - Integer settleBetweenScrollsTimeout; - Duration dragDuration; - - private ScrollOptions() { - } - - public ScrollOptions(AppiumBy.FlutterBy scrollTo, ScrollDirection scrollDirection) { - Preconditions.checkArgument(scrollTo != null, "Must supply a valid locator for scrollTo"); - this.scrollTo = scrollTo; - this.scrollDirection = scrollDirection; - } - - @Override - public Map toJson() { - return Map.of( - "finder", scrollTo.toJson(), - "scrollView", scrollView, - "delta", delta, - "maxScrolls", maxScrolls, - "settleBetweenScrollsTimeout", settleBetweenScrollsTimeout, - "scrollDirection", Optional.ofNullable(scrollDirection) - .orElse(ScrollDirection.UP).getDirection(), - "dragDuration", Optional.ofNullable(dragDuration) - .orElse(Duration.ZERO).getSeconds() - ); - } - - @Getter - public static enum ScrollDirection { - UP("up"), - RIGHT("right"), - DOWN("down"), - LEFT("left"); - - private final String direction; - - ScrollDirection(String direction) { - this.direction = direction; - } - } -} diff --git a/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java b/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java deleted file mode 100644 index a3aaa3cd5..000000000 --- a/src/main/java/io/appium/java_client/flutter/commands/WaitOptions.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.appium.java_client.flutter.commands; - -import io.appium.java_client.AppiumBy; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.openqa.selenium.WebElement; - -import java.time.Duration; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -@Accessors(chain = true) -@Getter -@Setter -public class WaitOptions implements FlutterCommandOptions { - private WebElement element; - private AppiumBy.FlutterBy locator; - private Duration timeout; - - @Override - public Map toJson() { - Map args = new HashMap<>(); - args.put("element", element); - if (locator != null) { - args.put("locator", locator.toJson()); - } - if (timeout != null) { - args.put("timeout", timeout.getSeconds()); - } - return Collections.unmodifiableMap(args); - } -} From 01eb52c1832b38d847a6bd777f264eb83d1b7bd3 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 22:17:11 +0530 Subject: [PATCH 7/9] Address review comments --- src/main/java/io/appium/java_client/AppiumBy.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index d560967ef..5c1554c31 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Map; - import static com.google.common.base.Strings.isNullOrEmpty; @EqualsAndHashCode(callSuper = true) @@ -324,7 +323,7 @@ protected ByIosNsPredicate(String locatorString) { } } - public static class FlutterBy extends AppiumBy { + public abstract static class FlutterBy extends AppiumBy { protected FlutterBy(String selector, String locatorString, String locatorName) { super(selector, locatorString, locatorName); From 8ebd14055041928cc8220221dec0fb0f8c4418b1 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 22:35:30 +0530 Subject: [PATCH 8/9] Remove toJson implementation --- src/main/java/io/appium/java_client/AppiumBy.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index 5c1554c31..43c35842d 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -328,19 +328,7 @@ public abstract static class FlutterBy extends AppiumBy { protected FlutterBy(String selector, String locatorString, String locatorName) { super(selector, locatorString, locatorName); } - - /** - * Parses an {@link AppiumBy.FlutterBy} object into a Map of parameters - * to be executed by flutter integration driver. - * - * @return A {@link Map} containing the parsed parameters - */ - public Map toJson() { - return Map.of( - "using", this.getRemoteParameters().using(), - "value", this.getRemoteParameters().value() - ); - } + } From ad017d122d9f3a0835ac0975882d2d4e8db80990 Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Sat, 20 Jul 2024 22:38:34 +0530 Subject: [PATCH 9/9] Styling fixes --- src/main/java/io/appium/java_client/AppiumBy.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumBy.java b/src/main/java/io/appium/java_client/AppiumBy.java index 43c35842d..164c7d3e7 100644 --- a/src/main/java/io/appium/java_client/AppiumBy.java +++ b/src/main/java/io/appium/java_client/AppiumBy.java @@ -26,7 +26,6 @@ import java.io.Serializable; import java.util.List; -import java.util.Map; import static com.google.common.base.Strings.isNullOrEmpty; @@ -324,14 +323,11 @@ protected ByIosNsPredicate(String locatorString) { } public abstract static class FlutterBy extends AppiumBy { - protected FlutterBy(String selector, String locatorString, String locatorName) { super(selector, locatorString, locatorName); } - } - public static class ByFlutterType extends FlutterBy implements Serializable { protected ByFlutterType(String locatorString) { super("-flutter type", locatorString, "flutterType");