Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
Jonahss opened this issue Jun 23, 2014 · 17 comments
Closed

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

Jonahss opened this issue Jun 23, 2014 · 17 comments

Comments

@Jonahss
Copy link
Member

Jonahss commented Jun 23, 2014

As mentioned in #22

@TikhomirovSergey
Copy link
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)

@TikhomirovSergey
Copy link
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.

@prattpratt
Copy link
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.

@TikhomirovSergey
Copy link
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.

@prattpratt
Copy link
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.

@TikhomirovSergey
Copy link
Contributor

Yaeh! It is the great idea!

@TikhomirovSergey
Copy link
Contributor

I will implement this soon.

@TikhomirovSergey
Copy link
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.

@Jonahss
Copy link
Member Author

Jonahss commented Jul 15, 2014

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.

@TikhomirovSergey
Copy link
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.

@TikhomirovSergey
Copy link
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!

@umer-ali-khan
Copy link

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?

@suganeby
Copy link

@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

@Henkoglobin
Copy link

Henkoglobin commented May 30, 2017

@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.

@suganeby
Copy link

@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.

@VenkateshPS
Copy link

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

@umer-ali-khan
Copy link

@findby

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants