From 116156334d617ed5970d141a3655a895290b052d Mon Sep 17 00:00:00 2001 From: Matthew Taylor Date: Fri, 23 Sep 2016 00:21:34 -0400 Subject: [PATCH 1/4] Add NSPredicate locator to IOSDriver and iOSFindBy --- src/main/java/io/appium/java_client/ios/IOSDriver.java | 3 ++- .../io/appium/java_client/pagefactory/iOSFindBy.java | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/ios/IOSDriver.java b/src/main/java/io/appium/java_client/ios/IOSDriver.java index 518f186a1..a4b3fdab4 100644 --- a/src/main/java/io/appium/java_client/ios/IOSDriver.java +++ b/src/main/java/io/appium/java_client/ios/IOSDriver.java @@ -19,6 +19,7 @@ import static io.appium.java_client.MobileCommand.prepareArguments; import io.appium.java_client.AppiumDriver; +import io.appium.java_client.FindsByIosNSPredicate; import io.appium.java_client.FindsByIosUIAutomation; import io.appium.java_client.ios.internal.JsonToIOSElementConverter; import io.appium.java_client.remote.MobilePlatform; @@ -50,7 +51,7 @@ public class IOSDriver extends AppiumDriver implements IOSDeviceActionShortcuts, - FindsByIosUIAutomation, LocksIOSDevice { + FindsByIosUIAutomation, FindsByIosNSPredicate, LocksIOSDevice { private static final String IOS_PLATFORM = MobilePlatform.IOS; diff --git a/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java b/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java index 0686cf9ef..fbc026228 100644 --- a/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java @@ -27,7 +27,7 @@ * element or a list of elements. Used in conjunction with * {@link org.openqa.selenium.support.PageFactory} * this allows users to quickly and easily create PageObjects. - * using iOS UI selectors, accessibility, id, name, class name, tag and xpath + * using iOS UI selectors, predicate, accessibility, id, name, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface iOSFindBy { @@ -38,6 +38,13 @@ */ String uiAutomator() default ""; + /** + * It is a properly formatted string for an NSPredicate. + * {@link "https://developer.apple.com/library/content/documentation/Cocoa/ + * Conceptual/Predicates/AdditionalChapters/Introduction.html"} + */ + String predicate() default ""; + /** * It an UI automation accessibility Id which is a convenient to iOS. * About iOS accessibility From e8a00d62322bc9c4238aefa6c45a58c10c83adf5 Mon Sep 17 00:00:00 2001 From: Matthew Taylor Date: Fri, 23 Sep 2016 01:36:52 -0400 Subject: [PATCH 2/4] Predicate locator added to IOSElement and PageFactory strategies. Tests updated --- .../java/io/appium/java_client/ios/IOSElement.java | 4 +++- .../pagefactory/bys/builder/Strategies.java | 9 +++++++++ .../io/appium/java_client/ios/IOSElementTest.java | 6 ++++++ .../io/appium/java_client/ios/IOSSearchingTest.java | 10 ++++++++++ .../pagefactory_tests/IOSPageFactoryTest.java | 12 ++++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/ios/IOSElement.java b/src/main/java/io/appium/java_client/ios/IOSElement.java index cac1b54f3..094939fb0 100644 --- a/src/main/java/io/appium/java_client/ios/IOSElement.java +++ b/src/main/java/io/appium/java_client/ios/IOSElement.java @@ -16,9 +16,11 @@ package io.appium.java_client.ios; +import io.appium.java_client.FindsByIosNSPredicate; import io.appium.java_client.FindsByIosUIAutomation; import io.appium.java_client.MobileElement; public class IOSElement extends MobileElement - implements FindsByIosUIAutomation { + implements FindsByIosUIAutomation, + FindsByIosNSPredicate { } diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java index e712e41bb..c90eb0357 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java @@ -40,6 +40,15 @@ enum Strategies { return super.getBy(annotation); } }, + BYPREDICATE("predicate") { + @Override By getBy(Annotation annotation) { + String value = getValue(annotation, this); + if(annotation.annotationType().equals(iOSFindBy.class)) { + return MobileBy.iOSNsPredicateString(value); + } + return super.getBy(annotation); + } + }, BYACCESSABILITY("accessibility") { @Override By getBy(Annotation annotation) { return MobileBy.AccessibilityId(getValue(annotation, this)); diff --git a/src/test/java/io/appium/java_client/ios/IOSElementTest.java b/src/test/java/io/appium/java_client/ios/IOSElementTest.java index fc465395a..ce296873c 100644 --- a/src/test/java/io/appium/java_client/ios/IOSElementTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSElementTest.java @@ -34,6 +34,12 @@ public class IOSElementTest extends BaseIOSTest { .findElementByIosUIAutomation(".elements().withName(\"Answer\")").getText(), null); } + @Test public void findByPredicateTest() { + assertNotEquals(((IOSElement) driver.findElementsByClassName("UIAWindow") + .get(1)) + .findElementByIosNsPredicate("name CONTAINS 'Compute'").getText(), null); + } + @Test public void setValueNunslaughterTest() { IOSElement slider = (IOSElement) driver.findElementByClassName("UIASlider"); slider.setValue("0%"); diff --git a/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java b/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java index 15943ec7c..1047f4acb 100644 --- a/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java @@ -39,4 +39,14 @@ public class IOSSearchingTest extends BaseIOSTest { .findElementsByIosUIAutomation(".elements().withName(\"Answer\")") .size(), 0); } + + @Test public void findByPredicateTest() { + assertNotEquals(driver + .findElementByIosNsPredicate("name CONTAINS 'Compute'") + .getText(), null); + assertNotEquals(driver + .findElementsByIosNsPredicate("name CONTAINS 'Compute'") + .size(), 0); + } + } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java index f670eb250..a17dca3d1 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java @@ -63,6 +63,8 @@ public class IOSPageFactoryTest { @iOSFindBy(uiAutomator = ".elements()[0]") private List iosUIAutomatorButtons; + @iOSFindBy(predicate = "name CONTAINS 'Compute'") private List iosPredicateButtons; + @iOSFindBy(uiAutomator = ".elements()[0]") @AndroidFindBy(className = "android.widget.TextView") private List androidOriOsTextViews; @@ -87,6 +89,8 @@ public class IOSPageFactoryTest { @iOSFindBy(uiAutomator = ".elements()[0]") private WebElement iosUIAutomatorButton; + @iOSFindBy(predicate = "name CONTAINS 'Compute'") private WebElement iosPredicateButton; + @AndroidFindBy(className = "android.widget.TextView") @iOSFindBy(uiAutomator = ".elements()[0]") private WebElement androidOriOsTextView; @@ -216,6 +220,14 @@ public class IOSPageFactoryTest { assertNotEquals(null, iosUIAutomatorButton.getText()); } + @Test public void iosFindByPredicateElementsTest() { + assertNotEquals(0, iosPredicateButtons.size()); + } + + @Test public void iosFindByPredicateElementTest() { + assertNotEquals(null, iosPredicateButton.getText()); + } + @Test public void areMobileElementsTest() { assertNotEquals(0, mobileButtons.size()); } From 4248c139cbf313d4e83782352da4e69e9e813d31 Mon Sep 17 00:00:00 2001 From: Matthew Taylor Date: Sun, 25 Sep 2016 13:23:49 -0400 Subject: [PATCH 3/4] Checkstyle fix --- .../appium/java_client/pagefactory/bys/builder/Strategies.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java index c90eb0357..9f8ee6e56 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/Strategies.java @@ -43,7 +43,7 @@ enum Strategies { BYPREDICATE("predicate") { @Override By getBy(Annotation annotation) { String value = getValue(annotation, this); - if(annotation.annotationType().equals(iOSFindBy.class)) { + if (annotation.annotationType().equals(iOSFindBy.class)) { return MobileBy.iOSNsPredicateString(value); } return super.getBy(annotation); From 889209f2f1857987faa85b883ec07645d8f3ddfb Mon Sep 17 00:00:00 2001 From: Matthew Taylor Date: Mon, 3 Oct 2016 01:13:38 -0400 Subject: [PATCH 4/4] Find by iOS predicate tests fixes --- src/test/java/io/appium/java_client/ios/IOSElementTest.java | 2 +- src/test/java/io/appium/java_client/ios/IOSSearchingTest.java | 4 ++-- .../java_client/pagefactory_tests/IOSPageFactoryTest.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/io/appium/java_client/ios/IOSElementTest.java b/src/test/java/io/appium/java_client/ios/IOSElementTest.java index ce296873c..4a9ce0f90 100644 --- a/src/test/java/io/appium/java_client/ios/IOSElementTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSElementTest.java @@ -37,7 +37,7 @@ public class IOSElementTest extends BaseIOSTest { @Test public void findByPredicateTest() { assertNotEquals(((IOSElement) driver.findElementsByClassName("UIAWindow") .get(1)) - .findElementByIosNsPredicate("name CONTAINS 'Compute'").getText(), null); + .findElementByIosNsPredicate("label CONTAINS 'Compute'").getText(), null); } @Test public void setValueNunslaughterTest() { diff --git a/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java b/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java index 1047f4acb..ebdf794f3 100644 --- a/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSSearchingTest.java @@ -42,10 +42,10 @@ public class IOSSearchingTest extends BaseIOSTest { @Test public void findByPredicateTest() { assertNotEquals(driver - .findElementByIosNsPredicate("name CONTAINS 'Compute'") + .findElementByIosNsPredicate("label CONTAINS 'Compute'") .getText(), null); assertNotEquals(driver - .findElementsByIosNsPredicate("name CONTAINS 'Compute'") + .findElementsByIosNsPredicate("label CONTAINS 'Compute'") .size(), 0); } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java index a17dca3d1..0cc06f52b 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/IOSPageFactoryTest.java @@ -63,7 +63,7 @@ public class IOSPageFactoryTest { @iOSFindBy(uiAutomator = ".elements()[0]") private List iosUIAutomatorButtons; - @iOSFindBy(predicate = "name CONTAINS 'Compute'") private List iosPredicateButtons; + @iOSFindBy(predicate = "label CONTAINS 'Compute'") private List iosPredicateButtons; @iOSFindBy(uiAutomator = ".elements()[0]") @AndroidFindBy(className = "android.widget.TextView") private List androidOriOsTextViews; @@ -89,7 +89,7 @@ public class IOSPageFactoryTest { @iOSFindBy(uiAutomator = ".elements()[0]") private WebElement iosUIAutomatorButton; - @iOSFindBy(predicate = "name CONTAINS 'Compute'") private WebElement iosPredicateButton; + @iOSFindBy(predicate = "label CONTAINS 'Compute'") private WebElement iosPredicateButton; @AndroidFindBy(className = "android.widget.TextView") @iOSFindBy(uiAutomator = ".elements()[0]") private WebElement androidOriOsTextView;