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 webElementClass: - availableElementClasses){ - if (!webElementClass.equals(type)){ + for (Class 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); }