What is the use of Annotation "@FindBy"?

63.3k views Asked by At

Can anyone explain me about Annotation @FindBy in WebDriver?

Where and why it is used?

4

There are 4 answers

5
Slava Semushin On

Can I cite API-documentation?

Used to mark a field on a Page Object to indicate an alternative mechanism for locating the element or a list of elements. Used in conjunction with PageFactory#proxyElement this allows users to quickly and easily create PageObjects.

So, if you use PageObject pattern then you adds this annotation to class members and WebDriver automatically inject appropriate WebElements to it during object initialization (when PageFactory.initElements() called).

I strongly recommend to follow this link and read about PageObject pattern and @FindBy annotations usage with more examples.

3
el roso On

It's to assist with the construction of locators when using the Page Factory to support your Page Objects

PageFactory Wiki Page

However I'm discovering that I find it more useful to store your locators as By objects rather than WebElements as they are more flexible and you tend to avoid running into the StaleElementException.

By myLocator = By.id("idOfYourElement")

instead of

@FindBy(id = "idOfYourElement")
WebElement myLocator;

This way you can also use your locators when asserting the absence of an element or use it in the ExpectedConditions helpers.

0
kamal On

You can also use Pagefactory, and have something like:

@FindBy(how = How.NAME, using = "logonName")
private WebElement logonNameField;

@FindBy(how = How.NAME, using = "password")
private WebElement passwordField;

Now, as for How., you can have:

  1. CLASS_NAME
  2. CSS
  3. ID
  4. ID_OR_NAME
  5. LINK_TEXT
  6. NAME
  7. PARTIAL_LINK_TEXT
  8. TAG_NAME
  9. XPATH
  10. class

Or you can use your own DOM Search plus Xpath, that would be outside of WebDriver API , but it should work.

1
The man On

With the help of PageFactory class, we use annotations @FindBy to find WebElements. We use initElements method to initialize web elements. @FindBy can accept tagName, partialLinkText, name, linkText, id, css, className, xpath as attributes.

The @FindBy annotation locates one or more WebElements using a single criterion. For example, to identify all elements that have the same class attribute, we could use the following identification:

@FindBy(how = How.CLASS_NAME, using = "classname")
private List<WebElement> singlecriterion;`enter code here`