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/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..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 @@ -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/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 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..4a9ce0f90 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("label 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..ebdf794f3 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("label CONTAINS 'Compute'") + .getText(), null); + assertNotEquals(driver + .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 f670eb250..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,6 +63,8 @@ public class IOSPageFactoryTest { @iOSFindBy(uiAutomator = ".elements()[0]") private List iosUIAutomatorButtons; + @iOSFindBy(predicate = "label 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 = "label 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()); }