From 75433564033cb55bde74595beb3dcf08a9fb9c24 Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Fri, 5 Feb 2016 00:29:29 +0530 Subject: [PATCH 1/8] removed name locator strategy from android and ios drivers along with its tests --- .../DefaultGenericMobileElement.java | 10 ++++++-- .../pagefactory/AndroidFindBy.java | 3 +-- .../pagefactory/SelendroidFindBy.java | 3 +-- .../java_client/pagefactory/iOSFindBy.java | 3 +-- .../appium/java_client/ios/IOSDriverTest.java | 4 ++-- .../java_client/ios/iOSGestureTest.java | 2 +- .../pagefactory_tests/SelendroidModeTest.java | 24 ------------------- .../pagefactory_tests/iOSPageObjectTest.java | 4 ++-- 8 files changed, 16 insertions(+), 37 deletions(-) diff --git a/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java b/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java index 6681e04c4..976feb440 100644 --- a/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java +++ b/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java @@ -100,11 +100,17 @@ public List findElementsByTagName(String using) { return super.findElementsByTagName(using); } - public T findElementByName(String using) { + /** + * @throws WebDriverException This method doesn't work against native app UI. + */ + public T findElementByName(String using) throws WebDriverException{ return (T) super.findElementByName(using); } - public List findElementsByName(String using) { + /** + * @throws WebDriverException This method doesn't work against native app UI. + */ + public List findElementsByName(String using) throws WebDriverException{ return super.findElementsByName(using); } diff --git a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java index 1dd3e4856..8c5b5505c 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.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 Android UI selectors, accessibility, id, name, class name, tag and xpath + * using Android UI selectors, accessibility, id, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) @@ -35,7 +35,6 @@ String uiAutomator() default ""; String accessibility() default ""; String id() default ""; - String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; diff --git a/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java index 5e14c08a4..c58000df7 100644 --- a/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java @@ -27,13 +27,12 @@ * 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 Selendroid UI selectors like, id, name, class name, tag and xpath + * using Selendroid UI selectors like, id, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface SelendroidFindBy { String id() default ""; - String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; 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 b666df94c..877b73a72 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, accessibility, id, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) @@ -35,7 +35,6 @@ String uiAutomator() default ""; String accessibility() default ""; String id() default ""; - String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; diff --git a/src/test/java/io/appium/java_client/ios/IOSDriverTest.java b/src/test/java/io/appium/java_client/ios/IOSDriverTest.java index 843ee0a92..294a4df68 100644 --- a/src/test/java/io/appium/java_client/ios/IOSDriverTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSDriverTest.java @@ -124,7 +124,7 @@ public void hideKeyboardWithParametersTest() { @Test public void scrollToTest() { - MobileElement searchBar = driver.findElementByName("Search Bars"); + MobileElement searchBar = driver.findElementByXpath("//*[@name='Search Bars']"); Point before = searchBar.getLocation(); driver.scrollTo("Search Ba"); Point after = searchBar.getLocation(); @@ -133,7 +133,7 @@ public void scrollToTest() { @Test public void scrollToExactTest() { - MobileElement searchBar = driver.findElementByName("Search Bars"); + MobileElement searchBar = driver.findElementByXpath("//*[@name='Search Bars']"); Point before = searchBar.getLocation(); driver.scrollToExact("Search Bars"); Point after = searchBar.getLocation(); diff --git a/src/test/java/io/appium/java_client/ios/iOSGestureTest.java b/src/test/java/io/appium/java_client/ios/iOSGestureTest.java index 0abc2cd1b..2cb9a5f8b 100644 --- a/src/test/java/io/appium/java_client/ios/iOSGestureTest.java +++ b/src/test/java/io/appium/java_client/ios/iOSGestureTest.java @@ -134,7 +134,7 @@ public void TapSingleFingerTest() { @Test public void elementGestureTest(){ - MobileElement e = (MobileElement) driver.findElementByName("TextField1"); + MobileElement e = (MobileElement) driver.findElementByXpath("//*[@name='TextField1']"); e.tap(1, 1500); e.zoom(); e.pinch(); diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java index b3129e678..2dc4c0a99 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java @@ -50,15 +50,6 @@ public class SelendroidModeTest { @SelendroidFindBy(id = "text1") private WebElement textSelendroidId; - @SelendroidFindBy(name = "Accessibility") - private WebElement textName; - - @AndroidFindBy(name = "Accessibility") - private WebElement textNameAndroid; - - @FindBy(name = "Accessibility") - private WebElement textNameDefault; - @SelendroidFindBy(xpath = "//TextView[@value='Accessibility']") private WebElement textXpath; @@ -129,21 +120,6 @@ public void findBySelendroidSelectorTest() { assertNotEquals(null, textSelendroidId.getAttribute("text")); } - @Test - public void findByElementByNameTest() { - assertEquals("Accessibility", textName.getText()); - } - - @Test - public void findByElementByNameAndroidTest() { - assertEquals("Accessibility", textNameAndroid.getText()); - } - - @Test - public void findByElementByNameDefaultTest() { - assertEquals("Accessibility", textNameDefault.getText()); - } - @Test public void findByElementByXpathTest() { assertEquals("Accessibility", textXpath.getText()); 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 ac7c04d16..56dea6695 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 @@ -118,13 +118,13 @@ public class iOSPageObjectTest { @iOSFindAll({ @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(name = "ComputeSumButton") //it is real locator + @iOSFindBy(xpath = "ComputeSumButton") //it is real locator }) private WebElement findAllElement; @iOSFindAll({ @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(name = "ComputeSumButton") //it is real locator + @iOSFindBy(xpath = "ComputeSumButton") //it is real locator }) private List findAllElements; From 1499e0c0da17dd11d518860bf2dfd3f1aaa5a3df Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Sat, 6 Feb 2016 15:21:41 +0530 Subject: [PATCH 2/8] reverted as per comments --- .../DefaultGenericMobileElement.java | 10 +--- .../pagefactory/AndroidFindBy.java | 6 +++ .../pagefactory/SelendroidFindBy.java | 3 +- .../appium/java_client/ios/IOSDriverTest.java | 4 +- .../java_client/ios/iOSGestureTest.java | 2 +- .../pagefactory_tests/SelendroidModeTest.java | 46 ++++++++++++++----- .../pagefactory_tests/iOSPageObjectTest.java | 4 +- 7 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java b/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java index 976feb440..6681e04c4 100644 --- a/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java +++ b/src/main/java/io/appium/java_client/DefaultGenericMobileElement.java @@ -100,17 +100,11 @@ public List findElementsByTagName(String using) { return super.findElementsByTagName(using); } - /** - * @throws WebDriverException This method doesn't work against native app UI. - */ - public T findElementByName(String using) throws WebDriverException{ + public T findElementByName(String using) { return (T) super.findElementByName(using); } - /** - * @throws WebDriverException This method doesn't work against native app UI. - */ - public List findElementsByName(String using) throws WebDriverException{ + public List findElementsByName(String using) { return super.findElementsByName(using); } diff --git a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java index 8c5b5505c..163ab4e24 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java @@ -35,6 +35,12 @@ String uiAutomator() default ""; String accessibility() default ""; String id() default ""; + @Deprecated + /** + * By.name selector is not supported by Appium server node since 1.5.x. + * So this option is going to be removed further. Be careful. + */ + String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; diff --git a/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java index c58000df7..5e14c08a4 100644 --- a/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/SelendroidFindBy.java @@ -27,12 +27,13 @@ * 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 Selendroid UI selectors like, id, class name, tag and xpath + * using Selendroid UI selectors like, id, name, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface SelendroidFindBy { String id() default ""; + String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; diff --git a/src/test/java/io/appium/java_client/ios/IOSDriverTest.java b/src/test/java/io/appium/java_client/ios/IOSDriverTest.java index 294a4df68..843ee0a92 100644 --- a/src/test/java/io/appium/java_client/ios/IOSDriverTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSDriverTest.java @@ -124,7 +124,7 @@ public void hideKeyboardWithParametersTest() { @Test public void scrollToTest() { - MobileElement searchBar = driver.findElementByXpath("//*[@name='Search Bars']"); + MobileElement searchBar = driver.findElementByName("Search Bars"); Point before = searchBar.getLocation(); driver.scrollTo("Search Ba"); Point after = searchBar.getLocation(); @@ -133,7 +133,7 @@ public void scrollToTest() { @Test public void scrollToExactTest() { - MobileElement searchBar = driver.findElementByXpath("//*[@name='Search Bars']"); + MobileElement searchBar = driver.findElementByName("Search Bars"); Point before = searchBar.getLocation(); driver.scrollToExact("Search Bars"); Point after = searchBar.getLocation(); diff --git a/src/test/java/io/appium/java_client/ios/iOSGestureTest.java b/src/test/java/io/appium/java_client/ios/iOSGestureTest.java index 2cb9a5f8b..0abc2cd1b 100644 --- a/src/test/java/io/appium/java_client/ios/iOSGestureTest.java +++ b/src/test/java/io/appium/java_client/ios/iOSGestureTest.java @@ -134,7 +134,7 @@ public void TapSingleFingerTest() { @Test public void elementGestureTest(){ - MobileElement e = (MobileElement) driver.findElementByXpath("//*[@name='TextField1']"); + MobileElement e = (MobileElement) driver.findElementByName("TextField1"); e.tap(1, 1500); e.zoom(); e.pinch(); diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java index 2dc4c0a99..86d8ece1a 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java @@ -37,7 +37,7 @@ import static org.junit.Assert.*; public class SelendroidModeTest { - private static int SELENDROID_PORT = 9999; + private static int SELENDROID_PORT = 9999; private static WebDriver driver; private static AppiumDriverLocalService service; @@ -50,19 +50,28 @@ public class SelendroidModeTest { @SelendroidFindBy(id = "text1") private WebElement textSelendroidId; + @SelendroidFindBy(name = "Accessibility") + private WebElement textName; + + @AndroidFindBy(xpath = "//*[@name='Accessibility']") + private WebElement textNameAndroid; + + @FindBy(name = "Accessibility") + private WebElement textNameDefault; + @SelendroidFindBy(xpath = "//TextView[@value='Accessibility']") private WebElement textXpath; @SelendroidFindBys({ - @SelendroidFindBy(id = "text1")}) + @SelendroidFindBy(id = "text1")}) private WebElement textIds; @SelendroidFindAll({ - @SelendroidFindBy(id = "text1")}) + @SelendroidFindBy(id = "text1")}) private WebElement textAll; @SelendroidFindAll({ - @SelendroidFindBy(id = "text1")}) + @SelendroidFindBy(id = "text1")}) private List textsAll; @SelendroidFindBy(className = "android.widget.TextView") @@ -70,14 +79,14 @@ public class SelendroidModeTest { @SelendroidFindBy(tagName = "TextView") private WebElement textTag; - + @SelendroidFindBy(linkText = "Accessibility") private WebElement textLink; - + @SelendroidFindBy(partialLinkText = "ccessibilit") private WebElement textPartialLink; - @BeforeClass + @BeforeClass public static void beforeClass() throws Exception { AppiumServiceBuilder builder = new AppiumServiceBuilder().withArgument(GeneralServerFlag.AUTOMATION_NAME, AutomationName.SELENDROID); service = builder.build(); @@ -114,12 +123,27 @@ public static void afterClass() throws Exception { public void findByIdElementTest() { assertNotEquals(null, textId.getAttribute("text")); } - - @Test + + @Test public void findBySelendroidSelectorTest() { assertNotEquals(null, textSelendroidId.getAttribute("text")); } + @Test + public void findByElementByNameTest() { + assertEquals("Accessibility", textName.getText()); + } + + @Test + public void findByElementByNameAndroidTest() { + assertEquals("Accessibility", textNameAndroid.getText()); + } + + @Test + public void findByElementByNameDefaultTest() { + assertEquals("Accessibility", textNameDefault.getText()); + } + @Test public void findByElementByXpathTest() { assertEquals("Accessibility", textXpath.getText()); @@ -149,12 +173,12 @@ public void findByElementByCalssTest() { public void findByElementByTagTest() { assertNotEquals(null, textTag.getAttribute("text")); } - + @Test public void findBySelendroidAnnotationOnlyTest() { assertNotEquals(null, textSelendroidId.getAttribute("text")); } - + @Test public void findBySelendroidLinkTextTest() { assertEquals("Accessibility", textLink.getText()); 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 56dea6695..6c5ad54a2 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 @@ -118,13 +118,13 @@ public class iOSPageObjectTest { @iOSFindAll({ @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(xpath = "ComputeSumButton") //it is real locator + @iOSFindBy(xpath = "//*[@name='ComputeSumButton']") //it is real locator }) private WebElement findAllElement; @iOSFindAll({ @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(xpath = "ComputeSumButton") //it is real locator + @iOSFindBy(xpath = "//*[@name='ComputeSumButton']") //it is real locator }) private List findAllElements; From 145e175bff29e9ad4b5687132dcfb6f3014ef5b5 Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Sat, 6 Feb 2016 15:27:05 +0530 Subject: [PATCH 3/8] reverted as per comments --- .../java/io/appium/java_client/pagefactory/AndroidFindBy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java index 163ab4e24..89b9a47d7 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.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 Android UI selectors, accessibility, id, class name, tag and xpath + * using Android UI selectors, accessibility, id, name, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) @@ -40,7 +40,7 @@ * By.name selector is not supported by Appium server node since 1.5.x. * So this option is going to be removed further. Be careful. */ - String name() default ""; + String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; From d2c2f6c9a4b078aca1c6088f0dd8016b7af5492e Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Sat, 6 Feb 2016 15:29:40 +0530 Subject: [PATCH 4/8] reverted as per comments --- .../io/appium/java_client/pagefactory/AndroidFindBy.java | 3 +-- .../java/io/appium/java_client/pagefactory/iOSFindBy.java | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java index 89b9a47d7..5569fe839 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/AndroidFindBy.java @@ -39,8 +39,7 @@ /** * By.name selector is not supported by Appium server node since 1.5.x. * So this option is going to be removed further. Be careful. - */ - String name() default ""; + */String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; 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 877b73a72..623d9cb87 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, class name, tag and xpath + * using iOS UI selectors, accessibility, id, name, class name, tag and xpath */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) @@ -35,6 +35,10 @@ String uiAutomator() default ""; String accessibility() default ""; String id() default ""; + /** + * By.name selector is not supported by Appium server node since 1.5.x. + * So this option is going to be removed further. Be careful. + */String name() default ""; String className() default ""; String tagName() default ""; String xpath() default ""; From 4729c15c9e275acb4cc4311d94e39fd4cebc95d8 Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Sat, 6 Feb 2016 16:08:01 +0530 Subject: [PATCH 5/8] reverted as per comments --- .../pagefactory_tests/iOSPageObjectTest.java | 173 +++++++++--------- 1 file changed, 87 insertions(+), 86 deletions(-) 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 6c5ad54a2..ce83f3387 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 @@ -37,9 +37,9 @@ public class iOSPageObjectTest { - private static WebDriver driver; - private static AppiumDriverLocalService service; - private boolean populated = false; + private static WebDriver driver; + private static AppiumDriverLocalService service; + private boolean populated = false; @FindBy(className = "UIAButton") private List uiButtons; @@ -67,9 +67,9 @@ public class iOSPageObjectTest { private List remoteElementViews; @AndroidFindBys({ - @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), - @AndroidFindBy(className = "android.widget.TextView") - }) + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), + @AndroidFindBy(className = "android.widget.TextView") + }) private List chainElementViews; @@ -92,11 +92,11 @@ public class iOSPageObjectTest { @iOSFindBy(uiAutomator = ".elements()[0]") private MobileElement mobileButton; - @iOSFindBy(uiAutomator = ".elements()[0]") - private TouchableElement touchableButton; + @iOSFindBy(uiAutomator = ".elements()[0]") + private TouchableElement touchableButton; - @iOSFindBy(uiAutomator = ".elements()[0]") - private List touchableButtons; + @iOSFindBy(uiAutomator = ".elements()[0]") + private List touchableButtons; @FindBy(className = "UIAButton") private MobileElement mobiletFindBy_Button; @@ -105,69 +105,70 @@ public class iOSPageObjectTest { private RemoteWebElement remotetextVieW; @AndroidFindBys({ - @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), - @AndroidFindBy(className = "android.widget.TextView") - }) + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/list\")"), + @AndroidFindBy(className = "android.widget.TextView") + }) private WebElement chainElementView; - + @iOSFindBy(uiAutomator = ".elements()[0]") private IOSElement iosButton; - + @iOSFindBy(uiAutomator = ".elements()[0]") private List iosButtons; - + @iOSFindAll({ - @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(xpath = "//*[@name='ComputeSumButton']") //it is real locator + @iOSFindBy(xpath = "ComputeSumButton_Test"), + @iOSFindBy(name = "ComputeSumButton") //it is real locator }) private WebElement findAllElement; - + @iOSFindAll({ - @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(xpath = "//*[@name='ComputeSumButton']") //it is real locator + @iOSFindBy(xpath = "ComputeSumButton_Test"), + @iOSFindBy(name = "ComputeSumButton") //it is real locator }) private List findAllElements; - @AndroidFindBy(className = "android.widget.TextView") - @FindBy(css = "e.e1.e2") - private List elementsWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy; - - @AndroidFindBy(className = "android.widget.TextView") - @FindBy(css = "e.e1.e2") - private WebElement elementWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy; - - - @BeforeClass - public static void beforeClass() throws Exception { - service = AppiumDriverLocalService.buildDefaultService(); - service.start(); + @AndroidFindBy(className = "android.widget.TextView") + @FindBy(css = "e.e1.e2") + private List elementsWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy; - File appDir = new File("src/test/java/io/appium/java_client"); - File app = new File(appDir, "TestApp.app.zip"); - DesiredCapabilities capabilities = new DesiredCapabilities(); - capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, ""); - capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.4"); - capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator"); - capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath()); - driver = new IOSDriver<>(service.getUrl(), capabilities); - } + @AndroidFindBy(className = "android.widget.TextView") + @FindBy(css = "e.e1.e2") + private WebElement elementWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy; + + + @BeforeClass + public static void beforeClass() throws Exception { + service = AppiumDriverLocalService.buildDefaultService(); + service.start(); + + File appDir = new File("src/test/java/io/appium/java_client"); + File app = new File(appDir, "TestApp.app.zip"); + DesiredCapabilities capabilities = new DesiredCapabilities(); + capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, ""); + capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "7.1"); + capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator"); + capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath()); + driver = new IOSDriver(service.getUrl(), capabilities); + } + @SuppressWarnings("rawtypes") @Before public void setUp() throws Exception { - if (!populated) - PageFactory.initElements(new AppiumFieldDecorator(driver), this); + if (!populated) + PageFactory.initElements(new AppiumFieldDecorator(driver), this); - populated = true; + populated = true; } - @AfterClass - public static void afterClass() throws Exception { - if (driver != null) - driver.quit(); + @AfterClass + public static void afterClass() throws Exception { + if (driver != null) + driver.quit(); - if (service != null) - service.stop(); - } + if (service != null) + service.stop(); + } @Test public void findByElementsTest() { @@ -273,7 +274,7 @@ public void checkThatElementWasNotFoundByAndroidUIAutomator_Chain(){ } Assert.assertNotNull(nsee); } - + @Test public void isIOSElementTest(){ Assert.assertNotEquals(null, iosButton.getText()); @@ -294,38 +295,38 @@ public void findAllElementTest(){ Assert.assertNotEquals(null, findAllElement.getText()); } - @Test - public void isTouchAbleElement(){ - Assert.assertNotEquals(null, touchableButton.getText()); - } + @Test + public void isTouchAbleElement(){ + Assert.assertNotEquals(null, touchableButton.getText()); + } - @Test - public void areTouchAbleElements(){ - Assert.assertNotEquals(0, touchableButtons.size()); - } + @Test + public void areTouchAbleElements(){ + Assert.assertNotEquals(0, touchableButtons.size()); + } - @Test - @SuppressWarnings("unused") - public void isTheFieldIOSElement(){ + @Test + public void isTheFieldIOSElement(){ + @SuppressWarnings("unused") IOSElement iOSElement = (IOSElement) mobileButton; //declared as MobileElement - iOSElement = (IOSElement) iosUIAutomatorButton; //declared as WebElement - iOSElement = (IOSElement) remotetextVieW; //declared as RemoteWebElement - iOSElement = (IOSElement) touchableButton; //declared as TouchABLEElement - } - - @Test - public void checkThatTestWillNotBeFailedBecauseOfInvalidFindBy(){ - try { - Assert.assertNotEquals(null, elementWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy.getAttribute("text")); - } - catch (NoSuchElementException ignored){ - return; - } - throw new RuntimeException(NoSuchElementException.class.getName() + " has been expected."); - } - - @Test - public void checkThatTestWillNotBeFailedBecauseOfInvalidFindBy_List(){ - Assert.assertEquals(0, elementsWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy.size()); - } -} + iOSElement = (IOSElement) iosUIAutomatorButton; //declared as WebElement + iOSElement = (IOSElement) remotetextVieW; //declared as RemoteWebElement + iOSElement = (IOSElement) touchableButton; //declared as TouchABLEElement + } + + @Test + public void checkThatTestWillNotBeFailedBecauseOfInvalidFindBy(){ + try { + Assert.assertNotEquals(null, elementWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy.getAttribute("text")); + } + catch (NoSuchElementException ignored){ + return; + } + throw new RuntimeException(NoSuchElementException.class.getName() + " has been expected."); + } + + @Test + public void checkThatTestWillNotBeFailedBecauseOfInvalidFindBy_List(){ + Assert.assertEquals(0, elementsWhenAndroidLocatorIsNotDefinedAndThereIsInvalidFindBy.size()); + } +} \ No newline at end of file From c2abfd7152c9186387028b5980f972be17db613c Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Sat, 6 Feb 2016 16:10:17 +0530 Subject: [PATCH 6/8] reverted as per comments --- .../java_client/pagefactory_tests/SelendroidModeTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java index 86d8ece1a..fd15db3fb 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/SelendroidModeTest.java @@ -17,6 +17,7 @@ package io.appium.java_client.pagefactory_tests; import io.appium.java_client.android.AndroidDriver; +import io.appium.java_client.android.AndroidElement; import io.appium.java_client.pagefactory.*; import io.appium.java_client.remote.AutomationName; import io.appium.java_client.remote.MobileCapabilityType; @@ -53,7 +54,7 @@ public class SelendroidModeTest { @SelendroidFindBy(name = "Accessibility") private WebElement textName; - @AndroidFindBy(xpath = "//*[@name='Accessibility']") + @AndroidFindBy(name = "Accessibility") private WebElement textNameAndroid; @FindBy(name = "Accessibility") @@ -184,4 +185,4 @@ public void findBySelendroidLinkTextTest() { assertEquals("Accessibility", textLink.getText()); } -} +} \ No newline at end of file From c823138cf5f6605f834bfb33f5a1b5b11227b8f5 Mon Sep 17 00:00:00 2001 From: Srinivasan Sekar Date: Tue, 9 Feb 2016 00:02:07 +0530 Subject: [PATCH 7/8] handled invalid selector exception and deprecated name from iOSFindBy --- .../io/appium/java_client/pagefactory/ThrowableUtil.java | 7 ++++++- .../java/io/appium/java_client/pagefactory/iOSFindBy.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/ThrowableUtil.java b/src/main/java/io/appium/java_client/pagefactory/ThrowableUtil.java index b7c71fe96..bcfb18bf2 100644 --- a/src/main/java/io/appium/java_client/pagefactory/ThrowableUtil.java +++ b/src/main/java/io/appium/java_client/pagefactory/ThrowableUtil.java @@ -16,6 +16,7 @@ package io.appium.java_client.pagefactory; +import org.openqa.selenium.InvalidSelectorException; import org.openqa.selenium.StaleElementReferenceException; import java.lang.reflect.InvocationTargetException; @@ -28,7 +29,11 @@ static boolean isInvalidSelectorRootCause(Throwable e) { return false; } - if (String.valueOf(e.getMessage()).contains(INVALID_SELECTOR_PATTERN)) { + if (InvalidSelectorException.class.isAssignableFrom(e.getClass())) { + return true; + } + + if (String.valueOf(e.getMessage()).contains(INVALID_SELECTOR_PATTERN) || String.valueOf(e.getMessage()).contains("Locator Strategy \\w+ is not supported")) { return true; } 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 623d9cb87..6f38ed2a5 100644 --- a/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java +++ b/src/main/java/io/appium/java_client/pagefactory/iOSFindBy.java @@ -35,6 +35,7 @@ String uiAutomator() default ""; String accessibility() default ""; String id() default ""; + @Deprecated /** * By.name selector is not supported by Appium server node since 1.5.x. * So this option is going to be removed further. Be careful. From 5ed8b9e5ac3b4eda1ee20788cba31c0899220dea Mon Sep 17 00:00:00 2001 From: TikhomirovSergey Date: Wed, 10 Feb 2016 13:15:44 +0300 Subject: [PATCH 8/8] #311 fix Change list: - #313 merge - updated By-strategy building. Now By.Id is uesed when no locator-strategy defined for a native app. ByIdOrName is used when no locator-strategy defined for browser/webview - test improvement --- .../pagefactory/DefaultElementByBuilder.java | 33 ++++++++++++------- .../bys/builder/AppiumByBuilder.java | 16 +++++++++ .../MobileBrowserCompatibilityTest.java | 16 ++++----- .../pagefactory_tests/iOSPageObjectTest.java | 8 ++--- 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java b/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java index a98259028..3e581a0e4 100644 --- a/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java +++ b/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java @@ -16,9 +16,6 @@ package io.appium.java_client.pagefactory; -import static io.appium.java_client.remote.MobilePlatform.*; -import static io.appium.java_client.remote.AutomationName.*; - import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.util.HashMap; @@ -117,8 +114,7 @@ protected By buildDefaultBy() { @Override protected By buildMobileNativeBy() { AnnotatedElement annotatedElement = annotatedElementContainer.getAnnotated(); - if (ANDROID.toUpperCase().equals(platform) - && SELENDROID.toUpperCase().equals(automation)) { + if (isSelendroidAutomation()) { SelendroidFindBy selendroidFindBy = annotatedElement.getAnnotation(SelendroidFindBy.class); SelendroidFindBys selendroidFindBys = annotatedElement.getAnnotation(SelendroidFindBys.class); SelendroidFindAll selendroidFindByAll = annotatedElement.getAnnotation(SelendroidFindAll.class); @@ -136,7 +132,7 @@ protected By buildMobileNativeBy() { } } - if (ANDROID.toUpperCase().equals(platform)) { + if (isAndroid()) { AndroidFindBy androidFindBy = annotatedElement.getAnnotation(AndroidFindBy.class); AndroidFindBys androidFindBys= annotatedElement.getAnnotation(AndroidFindBys.class); AndroidFindAll androidFindAll = annotatedElement.getAnnotation(AndroidFindAll.class); @@ -154,7 +150,7 @@ protected By buildMobileNativeBy() { } } - if (IOS.toUpperCase().equals(platform)) { + if (isIOS()) { iOSFindBy iOSFindBy = annotatedElement.getAnnotation(iOSFindBy.class); iOSFindBys iOSFindBys= annotatedElement.getAnnotation(iOSFindBys.class); iOSFindAll iOSFindAll = annotatedElement.getAnnotation(iOSFindAll.class); @@ -181,6 +177,13 @@ public boolean isLookupCached() { return (annotatedElement.getAnnotation(CacheLookup.class) != null); } + private By returnMappedBy(By byDefault, By nativeAppBy) { + Map contentMap = new HashMap<>(); + contentMap.put(ContentType.HTML_OR_DEFAULT, byDefault); + contentMap.put(ContentType.NATIVE_MOBILE_SPECIFIC, nativeAppBy); + return new ContentMappedBy(contentMap); + } + @Override public By buildBy() { assertValidAnnotations(); @@ -188,18 +191,24 @@ public By buildBy() { By defaultBy = buildDefaultBy(); By mobileNativeBy = buildMobileNativeBy(); - if (defaultBy == null) { + String idOrName = ((Field) annotatedElementContainer.getAnnotated()).getName(); + + if (defaultBy == null && mobileNativeBy == null) { defaultBy = new ByIdOrName(((Field) annotatedElementContainer.getAnnotated()).getName()); + mobileNativeBy = new By.ById(idOrName); + return returnMappedBy(defaultBy, mobileNativeBy); } + if (defaultBy == null) { + defaultBy = new ByIdOrName(((Field) annotatedElementContainer.getAnnotated()).getName()); + return returnMappedBy(defaultBy, mobileNativeBy); + } if (mobileNativeBy == null) { mobileNativeBy = defaultBy; + return returnMappedBy(defaultBy, mobileNativeBy); } - Map contentMap = new HashMap<>(); - contentMap.put(ContentType.HTML_OR_DEFAULT, defaultBy); - contentMap.put(ContentType.NATIVE_MOBILE_SPECIFIC, mobileNativeBy); - return new ContentMappedBy(contentMap); + return returnMappedBy(defaultBy, mobileNativeBy); } } diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java index f07c01781..5602331a7 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java @@ -24,6 +24,10 @@ import java.util.ArrayList; import java.util.List; +import static io.appium.java_client.remote.AutomationName.SELENDROID; +import static io.appium.java_client.remote.MobilePlatform.ANDROID; +import static io.appium.java_client.remote.MobilePlatform.IOS; + /** * It is the basic handler of Appium-specific page object annotations * About the Page Object design pattern please read these documents: @@ -163,6 +167,18 @@ public void setAnnotated(AnnotatedElement annotated) { this.annotatedElementContainer.setAnnotated(annotated); } + protected boolean isAndroid() { + return ANDROID.toUpperCase().equals(platform); + } + + protected boolean isSelendroidAutomation() { + return isAndroid() && SELENDROID.toUpperCase().equals(automation); + } + + protected boolean isIOS() { + return IOS.toUpperCase().equals(platform); + } + /** * Defines how to transform given object (field, class, etc) * into {@link org.openqa.selenium.By} class used by webdriver to locate elements. diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java index dee99a560..3fe6773be 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java @@ -41,18 +41,18 @@ public class MobileBrowserCompatibilityTest { private WebDriver driver; - - @FindBy(name = "q") - @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/someId\")") - private WebElement searchTextField; + private AppiumDriverLocalService service; @AndroidFindBys({ @AndroidFindBy(className = "someClass"), @AndroidFindBy(xpath = "//someTag")}) - @FindBy(name="btnG") - private RemoteWebElement searchButton; - + private RemoteWebElement btnG; //this element should be found by id = 'btnG' or name = 'btnG' + + @FindBy(name = "q") + @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/someId\")") + private WebElement searchTextField; + @AndroidFindBy(className = "someClass") @FindBys({@FindBy(className = "r"), @FindBy(tagName = "a")}) private List foundLinks; @@ -84,7 +84,7 @@ public void test() { driver.get("https://www.google.com"); searchTextField.sendKeys("Hello"); - searchButton.click(); + btnG.click(); Assert.assertNotEquals(0, foundLinks.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 ce83f3387..5805b7369 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 @@ -117,14 +117,14 @@ public class iOSPageObjectTest { private List iosButtons; @iOSFindAll({ - @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(name = "ComputeSumButton") //it is real locator + @iOSFindBy(id = "ComputeSumButton_Test"), + @iOSFindBy(xpath = "//*[@name = \"ComputeSumButton\"]") //it is real locator }) private WebElement findAllElement; @iOSFindAll({ - @iOSFindBy(xpath = "ComputeSumButton_Test"), - @iOSFindBy(name = "ComputeSumButton") //it is real locator + @iOSFindBy(id = "ComputeSumButton_Test"), + @iOSFindBy(xpath = "//*[@name = \"ComputeSumButton\"]") //it is real locator }) private List findAllElements;