From eae1817bd0b45407c4e3219a7750d6c12e674ab1 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Sat, 20 Jul 2019 22:31:32 +0700 Subject: [PATCH] finder returns `FlutterElement` --- example/java/pom.xml | 7 +- .../test/java/example/appium/BaseDriver.java | 9 ++- .../test/java/example/appium/FlutterTest.java | 28 +++++--- finder/kotlin/build.gradle.kts | 3 +- .../appium_flutter/FlutterFinder.kt | 68 +++++++++++++++++++ .../appium_flutter/finder/FlutterElement.kt | 12 ++++ .../appium_flutter/finder/ancestor.kt | 11 ++- .../appium_flutter/finder/bySemanticsLabel.kt | 12 ++-- .../appium_flutter/finder/byTooltip.kt | 7 +- .../appium_flutter/finder/byType.kt | 7 +- .../appium_flutter/finder/byValueKey.kt | 12 ++-- .../appium_flutter/finder/descendant.kt | 11 ++- .../appium_flutter/finder/pageback.kt | 7 +- .../appium_flutter/finder/serializer.kt | 3 +- .../truongsinh/appium_flutter/finder/text.kt | 7 +- .../appium_flutter/finder/FinderTest.kt | 20 +++--- 16 files changed, 155 insertions(+), 69 deletions(-) create mode 100644 finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/FlutterFinder.kt create mode 100644 finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/FlutterElement.kt diff --git a/example/java/pom.xml b/example/java/pom.xml index 142d2fcd..f32d8f40 100644 --- a/example/java/pom.xml +++ b/example/java/pom.xml @@ -44,10 +44,15 @@ 2.2.4 + + io.appium + java-client + 4.1.2 + pro.truongsinh appium-flutter-finder - 0.0.1 + 0.0.2 diff --git a/example/java/src/test/java/example/appium/BaseDriver.java b/example/java/src/test/java/example/appium/BaseDriver.java index eddd5fe7..17e4c880 100644 --- a/example/java/src/test/java/example/appium/BaseDriver.java +++ b/example/java/src/test/java/example/appium/BaseDriver.java @@ -1,18 +1,20 @@ package example.appium; import io.appium.java_client.AppiumDriver; +import io.appium.java_client.MobileElement; import io.appium.java_client.ios.IOSDriver; import io.appium.java_client.service.local.AppiumDriverLocalService; import io.appium.java_client.service.local.AppiumServerHasNotBeenStartedLocallyException; import org.junit.After; import org.junit.Before; -import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.WebDriverWait; import java.io.File; public class BaseDriver { - public AppiumDriver driver; + public AppiumDriver driver; + public WebDriverWait wait; private static AppiumDriverLocalService service; @Before @@ -38,7 +40,8 @@ public void setUp() throws Exception { capabilities.setCapability("automationName", "Flutter"); - driver = new IOSDriver<>(service.getUrl(), capabilities); + driver = new IOSDriver(service.getUrl(), capabilities); + wait = new WebDriverWait(driver, 10); } @After diff --git a/example/java/src/test/java/example/appium/FlutterTest.java b/example/java/src/test/java/example/appium/FlutterTest.java index b07cb2e5..38b44655 100644 --- a/example/java/src/test/java/example/appium/FlutterTest.java +++ b/example/java/src/test/java/example/appium/FlutterTest.java @@ -1,19 +1,25 @@ package example.appium; +import org.junit.Before; import org.junit.Test; -import pro.truongsinh.appium_flutter.finder.Finder; -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; - -import java.util.List; +import pro.truongsinh.appium_flutter.FlutterFinder; import static org.junit.Assert.assertEquals; -public class FlutterTest extends BaseDriver{ - @Test - public void simpleTest(){ - String a = Finder.text("input"); - System.out.println(a); - } +import io.appium.java_client.MobileElement; + +public class FlutterTest extends BaseDriver { + protected FlutterFinder finder; + @Before + public void setUp() throws Exception { + super.setUp(); + finder = new FlutterFinder(driver); + } + @Test + public void basicTest () throws InterruptedException { + MobileElement el1 = finder.byValueKey("increment"); + el1.click(); + Thread.sleep(1000); + } } diff --git a/finder/kotlin/build.gradle.kts b/finder/kotlin/build.gradle.kts index d0a7cce7..176e9bf8 100644 --- a/finder/kotlin/build.gradle.kts +++ b/finder/kotlin/build.gradle.kts @@ -1,7 +1,7 @@ import org.gradle.jvm.tasks.Jar group = "pro.truongsinh" -version = "0.0.1" +version = "0.0.2" plugins { id("kotlinx-serialization") version "1.3.40" @@ -18,6 +18,7 @@ repositories { dependencies { implementation(kotlin("stdlib")) implementation ("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.11.1") + implementation ("io.appium:java-client:2.1.0") testImplementation("junit:junit:4.12") } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/FlutterFinder.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/FlutterFinder.kt new file mode 100644 index 00000000..231ad9e9 --- /dev/null +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/FlutterFinder.kt @@ -0,0 +1,68 @@ +package pro.truongsinh.appium_flutter + +import io.appium.java_client.MobileElement +import org.openqa.selenium.remote.RemoteWebDriver +import pro.truongsinh.appium_flutter.finder.FlutterElement +import pro.truongsinh.appium_flutter.finder.ancestor as _ancestor +import pro.truongsinh.appium_flutter.finder.bySemanticsLabel as _bySemanticsLabel +import pro.truongsinh.appium_flutter.finder.byTooltip as _byTooltip +import pro.truongsinh.appium_flutter.finder.byType as _byType +import pro.truongsinh.appium_flutter.finder.byValueKey as _byValueKey +import pro.truongsinh.appium_flutter.finder.descendant as _descendant +import pro.truongsinh.appium_flutter.finder.pageback as _pageback +import pro.truongsinh.appium_flutter.finder.text as _text + + +public class FlutterFinder(driver: RemoteWebDriver) { + private val driver = driver + fun ancestor(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false): FlutterElement { + val f = _ancestor(of, matching, matchRoot) + f.setParent(driver) + return f + } + fun bySemanticsLabel(label: String): FlutterElement { + val f = _bySemanticsLabel(label) + f.setParent(driver) + return f + } + fun bySemanticsLabel(label: Regex): FlutterElement { + val f = _bySemanticsLabel(label) + f.setParent(driver) + return f + } + fun byTooltip(input: String): FlutterElement { + val f = _byTooltip(input) + f.setParent(driver) + return f + } + fun byType(input: String): FlutterElement { + val f = _byType(input) + f.setParent(driver) + return f + } + fun byValueKey(input: String): FlutterElement { + val f = _byValueKey(input) + f.setParent(driver) + return f + } + fun byValueKey(input: Int): FlutterElement { + val f = _byValueKey(input) + f.setParent(driver) + return f + } + fun descendant(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false): FlutterElement { + val f = _descendant(of, matching, matchRoot) + f.setParent(driver) + return f + } + fun pageback(): FlutterElement { + val f = _pageback() + f.setParent(driver) + return f + } + fun text(input: String): FlutterElement { + val f = _text(input) + f.setParent(driver) + return f + } +} diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/FlutterElement.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/FlutterElement.kt new file mode 100644 index 00000000..542c5a01 --- /dev/null +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/FlutterElement.kt @@ -0,0 +1,12 @@ +package pro.truongsinh.appium_flutter.finder + +import io.appium.java_client.MobileElement + +public class FlutterElement : MobileElement { + private var _rawMap: Map + constructor(m: Map) { + _rawMap = m + id = serialize(m) + } + fun getRawMap(): Map { return _rawMap } +} \ No newline at end of file diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/ancestor.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/ancestor.kt index 18658541..8f2c70b5 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/ancestor.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/ancestor.kt @@ -1,18 +1,17 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun ancestor(of: String, matching: String, matchRoot: Boolean = false): String { +fun ancestor(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false): FlutterElement { val m = mutableMapOf( "finderType" to "Ancestor", "matchRoot" to matchRoot ) - deserialize(of).forEach { - print(it.value) + of.getRawMap().forEach { m.put("of_${it.key}", it.value!!) } - deserialize(matching).forEach { + matching.getRawMap().forEach { m.put("matching_${it.key}", it.value!!) } - return serialize(m) + return FlutterElement(m) } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/bySemanticsLabel.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/bySemanticsLabel.kt index a29f6d73..acce28c4 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/bySemanticsLabel.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/bySemanticsLabel.kt @@ -1,21 +1,19 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun bySemanticsLabel(label: String): String { - val base64Encoded = serialize(mapOf( +fun bySemanticsLabel(label: String): FlutterElement { + return FlutterElement(mapOf( "finderType" to "BySemanticsLabel", "isRegExp" to false, "label" to label )) - return base64Encoded } -fun bySemanticsLabel(label: Regex): String { - val base64Encoded = serialize(mapOf( +fun bySemanticsLabel(label: Regex): FlutterElement { + return FlutterElement(mapOf( "finderType" to "BySemanticsLabel", "isRegExp" to true, "label" to label.toString() )) - return base64Encoded } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byTooltip.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byTooltip.kt index d9d0b692..b19da94f 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byTooltip.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byTooltip.kt @@ -1,11 +1,10 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun byTooltip(input: String): String { - val base64Encoded = serialize(mapOf( +fun byTooltip(input: String): FlutterElement { + return FlutterElement(mapOf( "finderType" to "ByTooltipMessage", "text" to input )) - return base64Encoded } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byType.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byType.kt index bd0eb6f6..73c38184 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byType.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byType.kt @@ -1,11 +1,10 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun byType(input: String): String { - val base64Encoded = serialize(mapOf( +fun byType(input: String): FlutterElement { + return FlutterElement(mapOf( "finderType" to "ByType", "type" to input )) - return base64Encoded } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byValueKey.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byValueKey.kt index 4aefb733..028218c8 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byValueKey.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byValueKey.kt @@ -1,21 +1,19 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun byValueKey(input: String): String { - val base64Encoded = serialize(mapOf( +fun byValueKey(input: String): FlutterElement { + return FlutterElement(mapOf( "finderType" to "ByValueKey", "keyValueType" to "String", "keyValueString" to input )) - return base64Encoded } -fun byValueKey(input: Int): String { - val base64Encoded = serialize(mapOf( +fun byValueKey(input: Int): FlutterElement { + return FlutterElement(mapOf( "finderType" to "ByValueKey", "keyValueType" to "int", "keyValueString" to input )) - return base64Encoded } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/descendant.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/descendant.kt index 86456aeb..1e43935f 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/descendant.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/descendant.kt @@ -1,18 +1,17 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun descendant(of: String, matching: String, matchRoot: Boolean = false): String { +fun descendant(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false): FlutterElement { val m = mutableMapOf( "finderType" to "Descendant", "matchRoot" to matchRoot ) - deserialize(of).forEach { - print(it.value) + of.getRawMap().forEach { m.put("of_${it.key}", it.value!!) } - deserialize(matching).forEach { + matching.getRawMap().forEach { m.put("matching_${it.key}", it.value!!) } - return serialize(m) + return FlutterElement(m) } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/pageback.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/pageback.kt index 65d8e933..29878440 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/pageback.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/pageback.kt @@ -1,8 +1,7 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun pageback(): String { - val base64Encoded = serialize(mapOf("finderType" to "PageBack")) - return base64Encoded +fun pageback(): FlutterElement { + return FlutterElement(mapOf("finderType" to "PageBack")) } diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/serializer.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/serializer.kt index 227a8d39..ede5a6af 100644 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/serializer.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/serializer.kt @@ -1,4 +1,5 @@ - +@file:JvmName("_FinderRawMethods") +@file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder import java.util.Base64 diff --git a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/text.kt b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/text.kt index 556decee..9dc59990 100755 --- a/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/text.kt +++ b/finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/text.kt @@ -1,11 +1,10 @@ -@file:JvmName("Finder") +@file:JvmName("_FinderRawMethods") @file:JvmMultifileClass package pro.truongsinh.appium_flutter.finder -fun text(input: String): String { - val base64Encoded = serialize(mapOf( +fun text(input: String): FlutterElement { + return FlutterElement(mapOf( "finderType" to "ByText", "text" to input )) - return base64Encoded } diff --git a/finder/kotlin/src/test/kotlin/pro/truongsinh/appium_flutter/finder/FinderTest.kt b/finder/kotlin/src/test/kotlin/pro/truongsinh/appium_flutter/finder/FinderTest.kt index 4a237c3f..f36efe71 100755 --- a/finder/kotlin/src/test/kotlin/pro/truongsinh/appium_flutter/finder/FinderTest.kt +++ b/finder/kotlin/src/test/kotlin/pro/truongsinh/appium_flutter/finder/FinderTest.kt @@ -15,29 +15,29 @@ class FinderTest { of = pageback(), matching = pageback() ) - ) + ).id assertEquals(expected, observed) } @Test fun TestBySemanticsLabelString() { - assertEquals("eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ", bySemanticsLabel("simple")) + assertEquals("eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ", bySemanticsLabel("simple").id) } @Test fun TestBySemanticsLabelRegex() { - assertEquals("eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0", bySemanticsLabel(Regex("complicated"))) + assertEquals("eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0", bySemanticsLabel(Regex("complicated")).id) } @Test fun TestByTooltip() { - assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ", byTooltip("myText")) + assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ", byTooltip("myText").id) } @Test fun TestByType() { - assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9", byType("myText")) + assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9", byType("myText").id) } @Test fun testByValueKeyString() { val expectedJsonElement = deserialize("eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ") - val obserbedJsonElement = deserialize(byValueKey("42")) + val obserbedJsonElement = deserialize(byValueKey("42").id) assertEquals(true, expectedJsonElement.equals(obserbedJsonElement)) } @Test fun testByValueKeyInt() { val expectedJsonElement = deserialize("eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0") - val obserbedJsonElement = deserialize(byValueKey(42)) + val obserbedJsonElement = deserialize(byValueKey(42).id) assertEquals(true, expectedJsonElement.equals(obserbedJsonElement)) } @Test fun testDescendant() { @@ -51,13 +51,13 @@ class FinderTest { of = pageback(), matching = pageback() ) - ) + ).id assertEquals(expected, observed) } @Test fun testPageback() { - assertEquals("eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ", pageback()) + assertEquals("eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ", pageback().id) } @Test fun testText() { - assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0", text("This is 2nd route")) + assertEquals("eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0", text("This is 2nd route").id) } }