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 extends WebElement> 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());
+ }
}