Skip to content

Add @FindBy annotations for appium's extra locator strategies #52

Closed

Description

@Jonahss

As mentioned in #22

Activity

  1. TikhomirovSergey commented on Jul 13, 2014

    @TikhomirovSergey
    Contributor

    Hi!

    I made some draft which you can check out in my fork here: https://github.com/TikhomirovSergey/java-client/tree/master/src/main/java/io/appium/java_client/pagefactory
    I was in hurry when I was making this. So all that I made should be checked.

    Decorator: https://github.com/TikhomirovSergey/java-client/blob/master/src/main/java/io/appium/java_client/pagefactory/MobileFieldDecorator.java is the target.

    The estimated way of usage is
    PageFactory.initElements(new MobileFieldDecorator(webDriver), pageObject)

  2. TikhomirovSergey commented on Jul 14, 2014

    @TikhomirovSergey
    Contributor

    Idea is changed: PageFactory.initElements(new MobileElementLocatorFactory(driver), page);
    Decorator is excessive. I will prepare test soon.

    If you like this idea I can commit all that was done here - https://github.com/appium/java-client. But firstly I should test this.

  3. prattpratt commented on Jul 14, 2014

    @prattpratt
    Contributor

    I think that for native apps we need to have separate @AndroidFindBy and @IOSFindBy annotations as sometimes it is impossible to set the same location strategy for Android and IOS app that have the same (or similar) UI.
    In this case we can have all usual webdriver search strategies like id(), name(), className(), tagName(), xpath(), remove invalid ones like css(), linkText(), partialLinkText() and add special ones accessibilityId() for both, androidUIAutomator() for Android and iosUIAutomation() for IOS.

  4. TikhomirovSergey commented on Jul 14, 2014

    @TikhomirovSergey
    Contributor

    To @prattpratt
    What do think about @MobileBy(androidUI = "some selector") or @MobileBy(iosUI = "some selector")?
    Please see here https://github.com/TikhomirovSergey/java-client/blob/master/src/main/java/io/appium/java_client/pagefactory/MobileBy.java. The full model is here https://github.com/TikhomirovSergey/java-client/tree/master/src/main/java/io/appium/java_client/pagefactory. It is in my own fork for now. I think it is the same as @AndroidFindBy and @IOSFindBy. But I am agree that id(), name(), className(), tagName(), xpath() are useful there.

  5. prattpratt commented on Jul 14, 2014

    @prattpratt
    Contributor

    @TikhomirovSergey , my idea is that we definitely need both android and ios search strategies attached to every uielement. So you can specify completely different search strategies for Android and for IOS app (e.g. id() for android and xpath() for ios) in order to have a single PageObject for both apps and therefore use single test script:

    @AndroidFindBy(id = "android:id/alert_dialog_title")
    @IOSFindBy(xpath = "//UIAAlert/UIAScrollView/UIAStaticText[1]")
    MobileElement alertTitle;

    It's a bit complicated but I think it is realizable for sure. And it will be more reusable approach because we will have a single test scripts set for both Android & IOS app that share the same UI.

  6. TikhomirovSergey commented on Jul 14, 2014

    @TikhomirovSergey
    Contributor

    Yaeh! It is the great idea!

  7. TikhomirovSergey commented on Jul 14, 2014

    @TikhomirovSergey
    Contributor

    I will implement this soon.

  8. TikhomirovSergey commented on Jul 15, 2014

    @TikhomirovSergey
    Contributor

    I made annotations @AndroidFindBy and @iosFindBy. Also MobileAnnotations was remade. It not final result. MobileElementLocator.java has to be remade. All this stuff should be tested.

  9. Jonahss commented on Jul 15, 2014

    @Jonahss
    MemberAuthor

    Awesome! I'm on vacation for the next week, but will be happy to write some tests and review the code.

    About having the AndroidFindBy and iosFindBy, I was thinking of eventually creating two separate Driver classes. iosDriver and AndroidDriver, which both inherit from MobileDriver. Then there will no longer be confusion about which methods are unsupported on each platform. If the split is done like this, then there could be some default behavior in which search strategies are available on elements.

  10. TikhomirovSergey commented on Jul 17, 2014

    @TikhomirovSergey
    Contributor

    It is almost finished but is not tested. The next step is to prepare tests and to fix bugs that can be found out.

  11. TikhomirovSergey commented on Jul 22, 2014

    @TikhomirovSergey
    Contributor

    Hi!
    It is just achieved. If there is all right, WebElement can be instantiated by these ways:

    @FindBy(someStrategy) //for browser or Html UI
    @AndroidFindBy(someStrategy) //for Android UI of the same application. Strategies are:
    //uiAutomator, accessibility, id, name, className, tagName, xpath
    //@AndroidFindBys({@AndroidFindBy(someStrategy1), @AndroidFindBy(someStrategy2)}) is for chained search
    
    @iOSFindBy(someStrategy) //for iOS UI of the same application. Strategies are:
    //uiAutomator, accessibility, id, name, className, tagName, xpath
    //iOSFindBys({@iOSFindBy(someStrategy1), @iOSFindBy(someStrategy2)}) is for chained search
    WebElement someElement;

    or

    @FindBy(someStrategy)
    @AndroidFindBy(someStrategy) 
    @iOSFindBy(someStrategy)
    RemoteWebElement someElement;

    or

    @AndroidFindBy(someStrategy) 
    @iOSFindBy(someStrategy)
    MobileElement someElement;

    Now old browser page objects can be reusable with this decorator:

    PageFactory.initElements(new AppiumFieldDecorator(driver), pageObject);

    or

    PageFactory.initElements(new AppiumFieldDecorator(driver, 
              15, //default implicit waiting timeout for all strategies
            TimeUnit.SECONDS), 
                pageObject);

    All implemented functionality you can see here:
    https://github.com/TikhomirovSergey/java-client/tree/master/src/main/java/io/appium/java_client/pagefactory

    Tests are here:
    https://github.com/TikhomirovSergey/java-client/tree/master/src/test/java/io/appium/java_client/pagefactory_tests

    I have run test of Android and browser compatibility (Passed). Test for iOS will be run soon. I will make a pull request as soon as possible (maybe tomorrow).

    If there is all righ it will be the killer feature.
    Have a nice day!

  12. umer-ali-khan commented on May 17, 2016

    @umer-ali-khan

    fot Page tests and page factory if @findby is used to locate some element on hybrid app (web view - FB login page) then should testers need to explicitly change the context of the AppoumDriver?

  13. suganeby commented on May 26, 2017

    @suganeby

    @iOSFindBy(name = "XXXX") not working in the java-client version > 4.1.0. Getting below error,

    'name'is not part of the annotation io.appium.java_client.pagefactory.iOSFindBy

  14. Henkoglobin commented on May 30, 2017

    @Henkoglobin

    @suganeby the 'name' locator strategy has been removed more than a year ago: 7543356

    I can't, however, find any rationale for this. It'd be nice to know why the strategy has been removed.

  15. suganeby commented on May 31, 2017

    @suganeby

    @Henkoglobin
    I am still using java client version 3.4.1. I am mostly using name locator in my testcases. Class names are not unique. Elements in the table cells are not accessible even with the accessibility id. name locator was very helpful.

  16. VenkateshPS commented on Jul 17, 2017

    @VenkateshPS

    what strategy to use if have same locator id for iOS and Android ?

  17. umer-ali-khan commented on Jul 17, 2017

    @umer-ali-khan
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions