diff --git a/pom.xml b/pom.xml
index d134f5f4b..e2b90d265 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,133 +1,121 @@
-
-
- 4.0.0
-
- io.appium
- java-client
- 2.1.0
-
-
- com.google.code.gson
- gson
- 2.2.4
-
-
- org.seleniumhq.selenium
- selenium-java
- 2.43.1
-
-
- junit
- junit
- 4.11
-
-
- org.apache.httpcomponents
- httpclient
- 4.3.3
-
-
- com.google.guava
- guava
- 17.0
-
-
- cglib
- cglib
- 3.1
-
-
- jar
- java-client
- Java client for Appium Mobile Webdriver
- http://appium.io
-
-
-
- Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
- repo
-
-
-
-
- https://github.com/appium/java-client
- scm:git:git://github.com/appium/java-client.git
- scm:git:git@github.com:appium/java-client.git
-
-
-
-
- jonahss@gmail.com
- Jonah Stiennon
- https://github.com/jonahss
- jonahss
-
-
-
-
-
- ossrh
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- ossrh
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 2.2.1
-
-
- attach-sources
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.9.1
-
-
- attach-javadocs
-
- jar
-
-
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.5
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 2.3.2
-
- 1.7
- 1.7
-
-
-
-
-
+
+
+ 4.0.0
+
+ io.appium
+ java-client
+ 2.1.0c1
+
+
+ com.google.code.gson
+ gson
+ 2.2.4
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ 2.43.1
+
+
+ junit
+ junit
+ 4.11
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.3.3
+
+
+ com.google.guava
+ guava
+ 17.0
+
+
+ cglib
+ cglib
+ 3.1
+
+
+ jar
+ java-client
+ Java client for Appium Mobile Webdriver
+ http://appium.io
+
+
+
+ Apache License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+ https://github.com/appium/java-client
+ scm:git:git://github.com/appium/java-client.git
+ scm:git:git@github.com:appium/java-client.git
+
+
+
+
+ jonahss@gmail.com
+ Jonah Stiennon
+ https://github.com/jonahss
+ jonahss
+
+
+
+
+
+ releases
+ Local Nexus Repository
+ http://maven.dev.sh.ctripcorp.com:8081/nexus/content/repositories/sysdevrelease/
+
+
+ snapshots
+ Local Nexus Repository
+ http://maven.dev.sh.ctripcorp.com:8081/nexus/content/repositories/sysdevsnapshot/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 2.2.1
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.9.1
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.3.2
+
+ 1.7
+ 1.7
+
+
+
+
+
diff --git a/src/main/java/io/appium/java_client/pagefactory/AppiumElementLocator.java b/src/main/java/io/appium/java_client/pagefactory/AppiumElementLocator.java
index 2572b7813..7cc27375c 100644
--- a/src/main/java/io/appium/java_client/pagefactory/AppiumElementLocator.java
+++ b/src/main/java/io/appium/java_client/pagefactory/AppiumElementLocator.java
@@ -24,7 +24,7 @@
import com.google.common.base.Function;
-class AppiumElementLocator implements ElementLocator {
+public class AppiumElementLocator implements ElementLocator {
// This function waits for not empty element list using all defined by
private static class WaitingFunction implements
@@ -48,6 +48,11 @@ public List apply(By by) {
}
}
+
+ public By getBy() {
+ return by;
+ }
+
private final SearchContext searchContext;
private final boolean shouldCache;
private final By by;
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 026ea3005..d93c989ca 100644
--- a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java
+++ b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java
@@ -5,12 +5,14 @@
import io.appium.java_client.ios.IOSElement;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
+import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebElement;
@@ -25,34 +27,37 @@
* elements using the passed in ElementLocatorFactory.
*
* Please pay attention: fields of {@link WebElement}, {@link RemoteWebElement},
- * {@link MobileElement}, {@link AndroidElement} and {@link IOSElement} are allowed
- * to use with this decorator
+ * {@link MobileElement}, {@link AndroidElement} and {@link IOSElement} 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);
- add(AndroidElement.class);
- add(IOSElement.class);
- }
-
+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);
+ add(AndroidElement.class);
+ add(IOSElement.class);
+ }
+
};
-
+ private FieldInteceptor fieldInteceptor;
+
private final AppiumElementLocatorFactory factory;
public static long DEFAULT_IMPLICITLY_WAIT_TIMEOUT = 1;
public static TimeUnit DEFAULT_TIMEUNIT = TimeUnit.SECONDS;
- public AppiumFieldDecorator(SearchContext context, long implicitlyWaitTimeOut, TimeUnit timeUnit) {
- factory = new AppiumElementLocatorFactory(context, implicitlyWaitTimeOut, timeUnit);
+ public AppiumFieldDecorator(SearchContext context,
+ long implicitlyWaitTimeOut, TimeUnit timeUnit) {
+ factory = new AppiumElementLocatorFactory(context,
+ implicitlyWaitTimeOut, timeUnit);
}
-
+
public AppiumFieldDecorator(SearchContext context) {
factory = new AppiumElementLocatorFactory(context);
}
@@ -68,19 +73,18 @@ public Object decorate(ClassLoader ignored, Field field) {
}
if (WebElement.class.isAssignableFrom(field.getType())) {
- return proxyForLocator(field, locator);
+ return proxyForLocator(field, locator);
} else if (List.class.isAssignableFrom(field.getType())) {
- return proxyForListLocator(locator);
+ return proxyForListLocator(locator);
} else {
return null;
}
}
- private static boolean isAvailableElementClass(Type type){
+ private static boolean isAvailableElementClass(Type type) {
boolean result = false;
- for (Class extends WebElement> webElementClass:
- availableElementClasses){
- if (!webElementClass.equals(type)){
+ for (Class extends WebElement> webElementClass : availableElementClasses) {
+ if (!webElementClass.equals(type)) {
continue;
}
result = true;
@@ -88,7 +92,7 @@ private static boolean isAvailableElementClass(Type type){
}
return result;
}
-
+
private boolean isDecoratableList(Field field) {
if (!List.class.isAssignableFrom(field.getType())) {
return false;
@@ -101,32 +105,42 @@ private boolean isDecoratableList(Field field) {
return false;
}
- Type listType = ((ParameterizedType) genericType).getActualTypeArguments()[0];
- return isAvailableElementClass(listType);
- //if there is no annotation list is supposed to be found by org.openqa.selenium.support.ByIdOrName
- //DefaultElementLocator has an issue :)
+ Type listType = ((ParameterizedType) genericType)
+ .getActualTypeArguments()[0];
+ return isAvailableElementClass(listType);
+ // if there is no annotation list is supposed to be found by
+ // org.openqa.selenium.support.ByIdOrName
+ // DefaultElementLocator has an issue :)
}
private Object proxyForLocator(Field field, ElementLocator locator) {
Class> type = field.getType();
- if (type.equals(WebElement.class)){
+ if (type.equals(WebElement.class)) {
type = RemoteWebElement.class;
}
- ElementInterceptor elementInterceptor = new ElementInterceptor(locator);
- return ProxyFactory.getEnhancedProxy(type,
- elementInterceptor);
+ ElementInterceptor elementInterceptor = new ElementInterceptor(locator,
+ fieldInteceptor);
+ return ProxyFactory.getEnhancedProxy(type, elementInterceptor);
}
-
+
@SuppressWarnings("unchecked")
- private List proxyForListLocator(
- ElementLocator locator) {
- ElementListInterceptor elementInterceptor = new ElementListInterceptor(locator);
+ private List proxyForListLocator(ElementLocator locator) {
+ ElementListInterceptor elementInterceptor = new ElementListInterceptor(
+ locator, fieldInteceptor);
return ProxyFactory.getEnhancedProxy(ArrayList.class,
elementInterceptor);
}
@Override
public void resetImplicitlyWaitTimeOut(long timeOut, TimeUnit timeUnit) {
- factory.resetImplicitlyWaitTimeOut(timeOut, timeUnit);
+ factory.resetImplicitlyWaitTimeOut(timeOut, timeUnit);
+ }
+
+ public void setFieldInteceptor(FieldInteceptor fieldInteceptor) {
+ this.fieldInteceptor = fieldInteceptor;
+ }
+
+ public static interface FieldInteceptor {
+ void pre(By by, Method method);
}
}
diff --git a/src/main/java/io/appium/java_client/pagefactory/ElementInterceptor.java b/src/main/java/io/appium/java_client/pagefactory/ElementInterceptor.java
index b028aa7a4..8d178bdbf 100644
--- a/src/main/java/io/appium/java_client/pagefactory/ElementInterceptor.java
+++ b/src/main/java/io/appium/java_client/pagefactory/ElementInterceptor.java
@@ -1,6 +1,7 @@
package io.appium.java_client.pagefactory;
import io.appium.java_client.MobileElement;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator.FieldInteceptor;
import java.lang.reflect.Method;
@@ -15,15 +16,30 @@
*
*/
class ElementInterceptor implements MethodInterceptor {
- private final ElementLocator locator;
+ private final ElementLocator locator;
+ private FieldInteceptor interceptor;
+
ElementInterceptor(ElementLocator locator) {
this.locator = locator;
}
-
+
+ public ElementInterceptor(ElementLocator locator,
+ FieldInteceptor interceptor) {
+ super();
+ this.locator = locator;
+ this.interceptor = interceptor;
+ }
+
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
WebElement realElement = locator.findElement();
+ if (interceptor != null) {
+ if (locator instanceof AppiumElementLocator) {
+ interceptor.pre(((AppiumElementLocator) locator).getBy(),
+ method);
+ }
+ }
return method.invoke(realElement, args);
}
diff --git a/src/main/java/io/appium/java_client/pagefactory/ElementListInterceptor.java b/src/main/java/io/appium/java_client/pagefactory/ElementListInterceptor.java
index 111ab5a49..0c7244a8d 100644
--- a/src/main/java/io/appium/java_client/pagefactory/ElementListInterceptor.java
+++ b/src/main/java/io/appium/java_client/pagefactory/ElementListInterceptor.java
@@ -1,6 +1,7 @@
package io.appium.java_client.pagefactory;
import io.appium.java_client.MobileElement;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator.FieldInteceptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -15,17 +16,31 @@
* Intercepts requests to the list of {@link MobileElement}
*
*/
-class ElementListInterceptor implements MethodInterceptor{
+public class ElementListInterceptor implements MethodInterceptor {
private final ElementLocator locator;
-
- ElementListInterceptor(ElementLocator locator){
+ private FieldInteceptor interceptor;
+
+ ElementListInterceptor(ElementLocator locator) {
+ this.locator = locator;
+ }
+
+ public ElementListInterceptor(ElementLocator locator,
+ FieldInteceptor interceptor) {
+ super();
this.locator = locator;
+ this.interceptor = interceptor;
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
ArrayList realElements = new ArrayList();
realElements.addAll(locator.findElements());
+ if (interceptor != null) {
+ if (locator instanceof AppiumElementLocator) {
+ interceptor.pre(((AppiumElementLocator) locator).getBy(),
+ method);
+ }
+ }
return method.invoke(realElements, args);
}