diff --git a/pom.xml b/pom.xml index cd4e5b727..fff038a23 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,21 @@ cglib 3.1 - + + org.reflections + reflections + 0.9.8 + + + guava + com.google.guava + + + xml-apis + xml-apis + + + jar java-client diff --git a/src/main/java/io/appium/java_client/AppiumDriver.java b/src/main/java/io/appium/java_client/AppiumDriver.java index 4c02a58f7..9193e7977 100644 --- a/src/main/java/io/appium/java_client/AppiumDriver.java +++ b/src/main/java/io/appium/java_client/AppiumDriver.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import io.appium.java_client.internal.JsonToMobileElementConverter; import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.*; import org.openqa.selenium.html5.Location; @@ -42,7 +41,7 @@ public abstract class AppiumDriver extends RemoteWebDriver implements MobileDriver, ContextAware, Rotatable, FindsByAccessibilityId, LocationContext, DeviceActionShortcuts, TouchShortcuts, InteractsWithFiles, - InteractsWithApps { + InteractsWithApps, ScrollsTo { private final static ErrorHandler errorHandler = new ErrorHandler( new ErrorCodesMobile(), true); @@ -106,7 +105,6 @@ protected static ImmutableMap getCommandImmutableMap( public AppiumDriver(URL remoteAddress, Capabilities desiredCapabilities) { super(remoteAddress, desiredCapabilities); - this.setElementConverter(new JsonToMobileElementConverter(this)); this.executeMethod = new AppiumExecutionMethod(this); this.remoteAddress = remoteAddress; @@ -525,22 +523,7 @@ public void lockScreen(int seconds) { execute(LOCK, ImmutableMap.of("seconds", seconds)); } - /** - * Scroll to an element which contains the given text. - * Implemented differently on iOS and Android, see docs for individual methods. - * @param text - */ - public abstract void scrollTo(String text); - - /** - * Scroll to an element with the given text. - * Implemented differently on iOS and Android, see docs for individual methods. - * @param text - */ - public abstract void scrollToExact(String text); - - - @Override + @Override public WebDriver context(String name) { if (!_isNotNullOrEmpty(name)) { throw new IllegalArgumentException("Must supply a context name"); diff --git a/src/main/java/io/appium/java_client/MobileElement.java b/src/main/java/io/appium/java_client/MobileElement.java index 8460be12b..e82fbb935 100644 --- a/src/main/java/io/appium/java_client/MobileElement.java +++ b/src/main/java/io/appium/java_client/MobileElement.java @@ -27,8 +27,7 @@ import java.util.List; -public class MobileElement extends RemoteWebElement implements FindsByAccessibilityId, FindsByAndroidUIAutomator, - FindsByIosUIAutomation { +public abstract class MobileElement extends RemoteWebElement implements FindsByAccessibilityId, ScrollsTo { protected FileDetector fileDetector; @@ -40,22 +39,6 @@ public WebElement findElement(By by) { return by.findElement(this); } - public WebElement findElementByIosUIAutomation(String using) { - return findElement("-ios uiautomation", using); - } - - public List findElementsByIosUIAutomation(String using) { - return findElements("-ios uiautomation", using); - } - - public WebElement findElementByAndroidUIAutomator(String using) { - return findElement("-android uiautomator", using); - } - - public List findElementsByAndroidUIAutomator(String using) { - return findElements("-android uiautomator", using); - } - public WebElement findElementByAccessibilityId(String using) { return findElement("accessibility id", using); } diff --git a/src/main/java/io/appium/java_client/ScrollsTo.java b/src/main/java/io/appium/java_client/ScrollsTo.java index bfb127b5e..348ab4a40 100644 --- a/src/main/java/io/appium/java_client/ScrollsTo.java +++ b/src/main/java/io/appium/java_client/ScrollsTo.java @@ -2,8 +2,16 @@ public interface ScrollsTo { + /** + * Scroll to an element which contains the given text. + * @param text + */ public MobileElement scrollTo(String text); + /** + * Scroll to an element with the given text. + * @param text + */ public MobileElement scrollToExact(String text); } diff --git a/src/main/java/io/appium/java_client/android/AndroidDriver.java b/src/main/java/io/appium/java_client/android/AndroidDriver.java index 87bcba7c2..28dbd295f 100644 --- a/src/main/java/io/appium/java_client/android/AndroidDriver.java +++ b/src/main/java/io/appium/java_client/android/AndroidDriver.java @@ -5,7 +5,9 @@ import io.appium.java_client.AppiumDriver; import io.appium.java_client.AppiumSetting; import io.appium.java_client.FindsByAndroidUIAutomator; +import io.appium.java_client.MobileElement; import io.appium.java_client.NetworkConnectionSetting; +import io.appium.java_client.android.internal.JsonToAndroidElementConverter; import io.appium.java_client.remote.MobilePlatform; import org.openqa.selenium.Capabilities; @@ -37,6 +39,7 @@ public class AndroidDriver extends AppiumDriver implements public AndroidDriver(URL remoteAddress, Capabilities desiredCapabilities) { super(remoteAddress, substituteMobilePlatform(desiredCapabilities, ANDROID_PLATFORM)); + this.setElementConverter(new JsonToAndroidElementConverter(this)); } /** @@ -45,10 +48,10 @@ public AndroidDriver(URL remoteAddress, Capabilities desiredCapabilities) { * @param text */ @Override - public void scrollTo(String text) { + public MobileElement scrollTo(String text) { String uiScrollables = UiScrollable("new UiSelector().descriptionContains(\"" + text + "\")") + UiScrollable("new UiSelector().textContains(\"" + text + "\")"); - findElementByAndroidUIAutomator(uiScrollables); + return (MobileElement) findElementByAndroidUIAutomator(uiScrollables); } /** @@ -57,13 +60,13 @@ public void scrollTo(String text) { * @param text */ @Override - public void scrollToExact(String text) { + public MobileElement scrollToExact(String text) { String uiScrollables = UiScrollable("new UiSelector().description(\"" + text + "\")") + UiScrollable("new UiSelector().text(\"" + text + "\")"); - findElementByAndroidUIAutomator(uiScrollables); + return (MobileElement) findElementByAndroidUIAutomator(uiScrollables); } - private String UiScrollable(String uiSelector) { + static String UiScrollable(String uiSelector) { return "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" + uiSelector + ".instance(0));"; } diff --git a/src/main/java/io/appium/java_client/android/AndroidElement.java b/src/main/java/io/appium/java_client/android/AndroidElement.java new file mode 100644 index 000000000..5e9f19c46 --- /dev/null +++ b/src/main/java/io/appium/java_client/android/AndroidElement.java @@ -0,0 +1,46 @@ +package io.appium.java_client.android; + +import java.util.List; + +import org.openqa.selenium.WebElement; + +import io.appium.java_client.FindsByAndroidUIAutomator; +import io.appium.java_client.MobileElement; + +public class AndroidElement extends MobileElement implements + FindsByAndroidUIAutomator { + + @Override + public WebElement findElementByAndroidUIAutomator(String using) { + return findElement("-android uiautomator", using); + } + + @Override + public List findElementsByAndroidUIAutomator(String using) { + return findElements("-android uiautomator", using); + } + + /** + * Scroll forward to the element which has a description or name which contains the input text. + * The scrolling is performed on the first scrollView present on the UI + * @param text + */ + @Override + public MobileElement scrollTo(String text) { + String uiScrollables = AndroidDriver.UiScrollable("new UiSelector().descriptionContains(\"" + text + "\")") + + AndroidDriver.UiScrollable("new UiSelector().textContains(\"" + text + "\")"); + return (MobileElement) findElementByAndroidUIAutomator(uiScrollables); + } + + /** + * Scroll forward to the element which has a description or name which exactly matches the input text. + * The scrolling is performed on the first scrollView present on the UI + * @param text + */ + @Override + public MobileElement scrollToExact(String text) { + String uiScrollables = AndroidDriver.UiScrollable("new UiSelector().description(\"" + text + "\")") + + AndroidDriver.UiScrollable("new UiSelector().text(\"" + text + "\")"); + return (MobileElement) findElementByAndroidUIAutomator(uiScrollables); + } +} diff --git a/src/main/java/io/appium/java_client/android/internal/JsonToAndroidElementConverter.java b/src/main/java/io/appium/java_client/android/internal/JsonToAndroidElementConverter.java new file mode 100644 index 000000000..8e419e9e9 --- /dev/null +++ b/src/main/java/io/appium/java_client/android/internal/JsonToAndroidElementConverter.java @@ -0,0 +1,21 @@ +package io.appium.java_client.android.internal; + +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.MobileElement; +import io.appium.java_client.android.AndroidElement; +import io.appium.java_client.internal.JsonToMobileElementConverter; + +public class JsonToAndroidElementConverter extends JsonToMobileElementConverter { + + public JsonToAndroidElementConverter(AppiumDriver driver) { + super(driver); + } + + @Override + protected MobileElement newMobileElement() { + AndroidElement toReturn = new AndroidElement(); + toReturn.setParent(driver); + return toReturn; + } + +} diff --git a/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java b/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java index a7b07a4b9..c74da925d 100644 --- a/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java +++ b/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java @@ -17,8 +17,8 @@ * Reconstitutes {@link WebElement}s from their JSON representation. Will recursively convert Lists * and Maps to catch nested references. All other values pass through the converter unchanged. */ -public class JsonToMobileElementConverter extends JsonToWebElementConverter { - private AppiumDriver driver; +public abstract class JsonToMobileElementConverter extends JsonToWebElementConverter { + protected AppiumDriver driver; public JsonToMobileElementConverter(AppiumDriver driver) { super(driver); @@ -53,9 +53,9 @@ public Object apply(Object result) { return result; } - protected MobileElement newMobileElement() { - MobileElement toReturn = new MobileElement(); - toReturn.setParent(driver); - return toReturn; - } + protected abstract MobileElement newMobileElement(); //{ + //MobileElement toReturn = new MobileElement(); + //toReturn.setParent(driver); + //return toReturn; + //} } 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 fb75349e7..e548418e2 100644 --- a/src/main/java/io/appium/java_client/ios/IOSDriver.java +++ b/src/main/java/io/appium/java_client/ios/IOSDriver.java @@ -5,6 +5,7 @@ import io.appium.java_client.AppiumDriver; import io.appium.java_client.FindsByIosUIAutomation; import io.appium.java_client.MobileElement; +import io.appium.java_client.ios.internal.JsonToIOSElementConverter; import io.appium.java_client.remote.MobilePlatform; import org.openqa.selenium.Capabilities; @@ -21,6 +22,7 @@ public class IOSDriver extends AppiumDriver implements IOSDeviceActionShortcuts, public IOSDriver(URL remoteAddress, Capabilities desiredCapabilities) { super(remoteAddress, substituteMobilePlatform(desiredCapabilities, IOS_PLATFORM)); + this.setElementConverter(new JsonToIOSElementConverter(this)); } /** @@ -28,48 +30,22 @@ public IOSDriver(URL remoteAddress, Capabilities desiredCapabilities) { * This scrolling happens within the first UIATableView on the UI. Use the additional 'context' param to specify a different scrollView. * @param text input text contained in text attribute */ - @Override - public void scrollTo(String text) { - scrollTo(text, (MobileElement) findElementByClassName("UIATableView")); - } + @Override + public MobileElement scrollTo(String text) { + return ((MobileElement) findElementByClassName("UIATableView")).scrollTo(text); + } - /** + /** * Scroll to the element whose 'text' attribute is equal to the input text. * This scrolling happens within the first UIATableView on the UI. Use the additional 'context' param to specify a different scrollView. * @param text input text to match */ - @Override - public void scrollToExact(String text) { - scrollToExact(text, (MobileElement) findElementByClassName("UIATableView")); - } - - /** - * Scroll to the element whose 'text' attribute contains the input text. - * @param text input text contained in text attribute - * @param context container element to scroll within - */ - public void scrollTo(String text, MobileElement context) { - context.findElementByIosUIAutomation(".scrollToElementWithPredicate(\"name CONTAINS '" + text + "'\")"); - } - - /** - * Scroll to the element whose 'text' attribute is equal to the input text. - * @param text input text to match - * @param context container element to scroll within - */ - public void scrollToExact(String text, MobileElement context) { - context.findElementByIosUIAutomation(".scrollToElementWithName(\"" + text + "\")"); - } - - /** - * Scroll to the given element. - * This scrolling happens within the first UIATableView on the UI. Use the ScrollToExactWithinContext() method to specify a different scrollView. - */ - public void scrollTo(WebElement el) { - scrollToExact(el.getText()); - } + @Override + public MobileElement scrollToExact(String text) { + return ((MobileElement) findElementByClassName("UIATableView")).scrollToExact(text); + } - /** + /** * @see IOSDeviceActionShortcuts#hideKeyboard(String, String) */ @Override diff --git a/src/main/java/io/appium/java_client/ios/IOSElement.java b/src/main/java/io/appium/java_client/ios/IOSElement.java new file mode 100644 index 000000000..80b7fada8 --- /dev/null +++ b/src/main/java/io/appium/java_client/ios/IOSElement.java @@ -0,0 +1,31 @@ +package io.appium.java_client.ios; + +import java.util.List; + +import org.openqa.selenium.WebElement; + +import io.appium.java_client.FindsByIosUIAutomation; +import io.appium.java_client.MobileElement; + +public class IOSElement extends MobileElement implements FindsByIosUIAutomation{ + + @Override + public WebElement findElementByIosUIAutomation(String using) { + return findElement("-ios uiautomation", using); + } + + @Override + public List findElementsByIosUIAutomation(String using) { + return findElements("-ios uiautomation", using); + } + + @Override + public MobileElement scrollTo(String text) { + return (MobileElement) findElementByIosUIAutomation(".scrollToElementWithPredicate(\"name CONTAINS '" + text + "'\")"); + } + + @Override + public MobileElement scrollToExact(String text) { + return (MobileElement) findElementByIosUIAutomation(".scrollToElementWithName(\"" + text + "\")"); + } +} diff --git a/src/main/java/io/appium/java_client/ios/internal/JsonToIOSElementConverter.java b/src/main/java/io/appium/java_client/ios/internal/JsonToIOSElementConverter.java new file mode 100644 index 000000000..d44be548d --- /dev/null +++ b/src/main/java/io/appium/java_client/ios/internal/JsonToIOSElementConverter.java @@ -0,0 +1,21 @@ +package io.appium.java_client.ios.internal; + +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.MobileElement; +import io.appium.java_client.internal.JsonToMobileElementConverter; +import io.appium.java_client.ios.IOSElement; + +public class JsonToIOSElementConverter extends JsonToMobileElementConverter { + + public JsonToIOSElementConverter(AppiumDriver driver) { + super(driver); + } + + @Override + protected MobileElement newMobileElement() { + IOSElement toReturn = new IOSElement(); + toReturn.setParent(driver); + return toReturn; + } + +} diff --git a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java index a24d06625..b2e178cc8 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java +++ b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java @@ -17,6 +17,7 @@ import org.openqa.selenium.support.FindBys; import org.openqa.selenium.support.pagefactory.ElementLocator; import org.openqa.selenium.support.pagefactory.FieldDecorator; +import org.reflections.Reflections; /** * Default decorator for use with PageFactory. Will decorate 1) all of the @@ -29,6 +30,21 @@ * {@link MobileElement} are allowed to use with this decorator */ public class AppiumFieldDecorator implements FieldDecorator, ResetsImplicitlyWaitTimeOut { + + private static final List> availableElementClasses = + new ArrayList>(){ + private static final long serialVersionUID = 1L; + { + add(WebElement.class); + add(RemoteWebElement.class); + add(MobileElement.class); + + Reflections r = new Reflections("io.appium"); + addAll(r.getSubTypesOf(MobileElement.class)); + } + + }; + private final AppiumElementLocatorFactory factory; public AppiumFieldDecorator(SearchContext context, long implicitlyWaitTimeOut, TimeUnit timeUnit) { @@ -40,7 +56,7 @@ public AppiumFieldDecorator(SearchContext context) { } public Object decorate(ClassLoader ignored, Field field) { - if (!(WebElement.class.isAssignableFrom(field.getType()) || isDecoratableList(field))) { + if (!(availableElementClasses.contains(field.getType()) || isDecoratableList(field))) { return null; } @@ -58,6 +74,19 @@ public Object decorate(ClassLoader ignored, Field field) { } } + private static boolean isAvailableElementClass(Type type){ + boolean result = false; + for (Class webElementClass: + availableElementClasses){ + if (!webElementClass.equals(type)){ + continue; + } + result = true; + break; + } + return result; + } + private boolean isDecoratableList(Field field) { if (!List.class.isAssignableFrom(field.getType())) { return false; @@ -70,14 +99,7 @@ private boolean isDecoratableList(Field field) { return false; } - Type listType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; - - if (!WebElement.class.equals(listType) && RemoteWebElement.class.equals(listType) - && MobileElement.class.equals(listType)) { - return false; - } - - + Type listType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; if (field.getAnnotation(AndroidFindBy.class) == null && field.getAnnotation(iOSFindBy.class) == null && field.getAnnotation(AndroidFindBys.class) == null @@ -87,8 +109,7 @@ private boolean isDecoratableList(Field field) { && field.getAnnotation(FindAll.class) == null){ return false; } - - return true; + return isAvailableElementClass(listType); } private Object proxyForLocator(Field field, ElementLocator locator) { diff --git a/src/test/java/io/appium/java_client/android/AndroidDriverTest.java b/src/test/java/io/appium/java_client/android/AndroidDriverTest.java index ad8b706be..31644dca7 100644 --- a/src/test/java/io/appium/java_client/android/AndroidDriverTest.java +++ b/src/test/java/io/appium/java_client/android/AndroidDriverTest.java @@ -18,14 +18,15 @@ package io.appium.java_client.android; import io.appium.java_client.AppiumSetting; +import io.appium.java_client.MobileElement; import io.appium.java_client.NetworkConnectionSetting; - import io.appium.java_client.remote.MobileCapabilityType; import org.apache.commons.codec.binary.Base64; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities; @@ -167,8 +168,20 @@ public void scrollToTest() { @Test public void scrollToExactTest() { - driver.scrollTo("Views"); + driver.scrollToExact("Views"); WebElement views = driver.findElementByAccessibilityId("Views"); assertNotNull(views); } + + @Test + public void scrollToFromElementTest() { + MobileElement el = ((MobileElement) (driver.findElement(By.className("android.widget.FrameLayout")))).scrollTo("View"); + assertNotNull(el); + } + + @Test + public void scrollToExactFromElementTest() { + MobileElement el = ((MobileElement) (driver.findElement(By.className("android.widget.FrameLayout")))).scrollToExact("Views"); + assertNotNull(el); + } } diff --git a/src/test/java/io/appium/java_client/android/AndroidUIAutomatorTest.java b/src/test/java/io/appium/java_client/android/AndroidUIAutomatorTest.java index c11e8edba..3c530dd69 100644 --- a/src/test/java/io/appium/java_client/android/AndroidUIAutomatorTest.java +++ b/src/test/java/io/appium/java_client/android/AndroidUIAutomatorTest.java @@ -69,8 +69,8 @@ public void findElementsByTest() { @Test public void findChainedElementsTest() { - MobileElement el1 = (MobileElement) driver.findElementByAndroidUIAutomator("resourceId(\"android:id/content\")"); - MobileElement el2 = (MobileElement) el1.findElementByAndroidUIAutomator("text(\"Accessibility\")"); + AndroidElement el1 = (AndroidElement) driver.findElementByAndroidUIAutomator("resourceId(\"android:id/content\")"); + AndroidElement el2 = (AndroidElement) el1.findElementByAndroidUIAutomator("text(\"Accessibility\")"); el2.click(); MobileElement el3 = (MobileElement) driver.findElementByAndroidUIAutomator("text(\"Custom View\")"); assertTrue(el3.isDisplayed()); diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/AndroidPageObjectTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/AndroidPageObjectTest.java index 8d588595a..9409cf624 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/AndroidPageObjectTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/AndroidPageObjectTest.java @@ -2,6 +2,7 @@ import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; +import io.appium.java_client.android.AndroidElement; import io.appium.java_client.pagefactory.AndroidFindBy; import io.appium.java_client.pagefactory.AndroidFindBys; import io.appium.java_client.pagefactory.AppiumFieldDecorator; @@ -64,6 +65,7 @@ public class AndroidPageObjectTest { private List iosChainTextViews; @AndroidFindBys({ + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/content\")"), @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), @AndroidFindBy(id = "android:id/text1") }) @@ -71,7 +73,6 @@ public class AndroidPageObjectTest { @iOSFindBy(xpath = "//someElement")}) private List chainAndroidOrIOSUIAutomatorViews; - @FindBy(id = "android:id/text1") private WebElement textView; @@ -108,12 +109,27 @@ public class AndroidPageObjectTest { private WebElement iosChainTextView; @AndroidFindBys({ + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/content\")"), @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), @AndroidFindBy(id = "android:id/text1") }) @iOSFindBys({@iOSFindBy(uiAutomator = ".elements()[0]"), @iOSFindBy(xpath = "//someElement")}) private WebElement chainAndroidOrIOSUIAutomatorView; + + @AndroidFindBys({ + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/content\")"), + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), + @AndroidFindBy(id = "android:id/text1") + }) + private AndroidElement androidElementView; + + @AndroidFindBys({ + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/content\")"), + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), + @AndroidFindBy(id = "android:id/text1") + }) + private List androidElementViews; @Before public void setUp() throws Exception { @@ -255,5 +271,15 @@ public void androidOrIOSFindByElementsTest_ChainSearches(){ @Test public void androidOrIOSFindByElementTest_ChainSearches(){ Assert.assertNotEquals(null, chainAndroidOrIOSUIAutomatorView.getAttribute("text")); - } + } + + @Test + public void isAndroidElementTest(){ + Assert.assertNotEquals(null, androidElementView.getAttribute("text")); + } + + @Test + public void areAndroidElementsTest(){ + Assert.assertNotEquals(0, androidElementViews.size()); + } } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/iOSPageObjectTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/iOSPageObjectTest.java index ae243800c..36ddf468b 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/iOSPageObjectTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/iOSPageObjectTest.java @@ -2,6 +2,7 @@ import io.appium.java_client.MobileElement; import io.appium.java_client.ios.IOSDriver; +import io.appium.java_client.ios.IOSElement; import io.appium.java_client.pagefactory.AndroidFindBy; import io.appium.java_client.pagefactory.AndroidFindBys; import io.appium.java_client.pagefactory.AppiumFieldDecorator; @@ -89,6 +90,12 @@ public class iOSPageObjectTest { @AndroidFindBy(className = "android.widget.TextView") }) private WebElement chainElementView; + + @iOSFindBy(uiAutomator = ".elements()[0]") + private IOSElement iosButton; + + @iOSFindBy(uiAutomator = ".elements()[0]") + private List iosButtons; @Before public void setUp() throws Exception { @@ -213,4 +220,14 @@ public void checkThatElementWasNotFoundByAndroidUIAutomator_Chain(){ } Assert.assertNotNull(nsee); } + + @Test + public void isIOSElementTest(){ + Assert.assertNotEquals(null, iosButton.getText()); + } + + @Test + public void areIOSElements_FindByTest(){ + Assert.assertNotEquals(0, iosButtons.size()); + } }