What is the purpose of the @FindBy annotation in Selenium?
The @FindBy annotation is used to locate web elements on a page in Selenium's Page Object Model. It helps to define how to find elements using locators like id, name, xpath, cssSelector, etc.
Click to reveal answer
beginner
How do you use @FindBy to locate an element by its ID?
You use @FindBy(id = "elementId") before a WebElement field to tell Selenium to find the element with that ID.
Click to reveal answer
intermediate
Can @FindBy use multiple locator strategies together? If yes, how?
Yes, by using @FindBys or @FindAll annotations to combine multiple @FindBy annotations for AND or OR conditions respectively.
Click to reveal answer
beginner
What happens if Selenium cannot find an element defined with @FindBy during test execution?
Selenium throws a NoSuchElementException when it tries to interact with the element and cannot find it on the page.
Click to reveal answer
beginner
Why is using @FindBy considered better than using driver.findElement() directly in tests?
Using @FindBy supports the Page Object Model, making tests cleaner, easier to maintain, and separating element locators from test logic.
Click to reveal answer
Which of the following is a valid way to locate an element using @FindBy?
A@FindBy(className = "btn")
B@FindBy(text = "username")
C@FindBy(id = "username")
D@FindBy(tag = "input")
✗ Incorrect
The correct locator attribute is 'id'. 'text' and 'tag' are not valid attributes for @FindBy. The correct attribute for class is 'className' (case sensitive).
What type of variable should be annotated with @FindBy?
AList<String>
BString
Cint
DWebElement
✗ Incorrect
@FindBy is used to locate WebElement or List<WebElement> variables.
Which annotation allows combining multiple @FindBy annotations with AND logic?
A@FindAll
B@FindBys
C@FindByMultiple
D@FindByGroup
✗ Incorrect
@FindBys combines multiple @FindBy annotations with AND logic.
If you want to locate elements by CSS selector using @FindBy, which attribute do you use?
AcssSelector
Bcss
Cstyle
Dselector
✗ Incorrect
The correct attribute is cssSelector.
What is the main advantage of using @FindBy in Page Object Model?
AIt separates element locators from test logic
BIt makes tests run faster
CIt automatically waits for elements
DIt replaces the need for assertions
✗ Incorrect
@FindBy helps separate element locators from test logic, improving code organization and maintainability.
Explain how to use the @FindBy annotation to locate a button by its CSS class and why this is useful in test automation.
Think about how you tell Selenium where to find the element and how it helps keep tests clean.
You got /3 concepts.
Describe what happens when Selenium cannot find an element defined with @FindBy during test execution and how you might handle it.
Consider what Selenium does when it looks for an element that is missing and how to make tests more reliable.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of the @FindBy annotation in Selenium Java?
easy
A. To execute JavaScript code on the web page
B. To locate web elements on a page using different strategies
C. To start the Selenium WebDriver session
D. To take screenshots during test execution
Solution
Step 1: Understand the role of @FindBy
The @FindBy annotation is used to specify how to find a web element on a page, such as by id, name, xpath, etc.
Step 2: Compare with other options
Options B, C, and D describe other Selenium features but not element locating.
Final Answer:
To locate web elements on a page using different strategies -> Option B
Quick Check:
@FindBy locates elements = A [OK]
Hint: Remember: @FindBy is for locating elements only [OK]
Common Mistakes:
Confusing @FindBy with WebDriver commands
Thinking @FindBy executes scripts
Assuming @FindBy starts browser sessions
2. Which of the following is the correct syntax to locate a web element by its ID using @FindBy annotation?
easy
A. @FindBy(id = "submitBtn")
B. @FindBy(name = submitBtn)
C. @FindBy(xpath = submitBtn)
D. @FindBy(css = #submitBtn)
Solution
Step 1: Check correct attribute usage
The @FindBy annotation requires the attribute name and value as a string. For ID, it is id = "value".
Step 2: Validate each option
@FindBy(id = "submitBtn") correctly uses id = "submitBtn". @FindBy(name = submitBtn) misses quotes. @FindBy(xpath = submitBtn) uses xpath but without quotes. @FindBy(css = #submitBtn) uses CSS selector but with incorrect syntax (should be css = "#submitBtn").
Final Answer:
@FindBy(id = "submitBtn") -> Option A
Quick Check:
Correct syntax uses id with quotes = B [OK]
Hint: Use quotes around locator values in @FindBy [OK]
Common Mistakes:
Omitting quotes around locator values
Mixing locator types incorrectly
Using invalid syntax for CSS selectors
3. Given the following code snippet, what will be the output when button.isDisplayed() is called?
public class LoginPage {
@FindBy(name = "loginBtn")
WebElement button;
public LoginPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
}
// In test method:
LoginPage page = new LoginPage(driver);
boolean visible = page.button.isDisplayed();
System.out.println(visible);
medium
A. Throws NullPointerException because button is not initialized
B. false always because @FindBy does not locate elements
C. true if the element with name 'loginBtn' is visible on the page
D. Compilation error due to missing @FindBy import
Solution
Step 1: Understand PageFactory initialization
The constructor calls PageFactory.initElements(driver, this), which initializes all @FindBy annotated elements, including button.
Step 2: Check behavior of isDisplayed()
If the element with name 'loginBtn' exists and is visible, isDisplayed() returns true; otherwise false. No NullPointerException occurs because initialization is done.
Final Answer:
true if the element with name 'loginBtn' is visible on the page -> Option C
Quick Check:
PageFactory initializes elements = true if visible [OK]
Hint: PageFactory.initElements must be called to avoid null elements [OK]
Common Mistakes:
Assuming elements are null without initialization
Confusing isDisplayed() with element presence
Ignoring the need to call PageFactory.initElements
4. Identify the error in the following code snippet using @FindBy:
public class HomePage {
@FindBy(xpath = "//button[@id='start']")
WebElement startButton;
public HomePage(WebDriver driver) {
// Missing initialization
}
}
medium
A. Missing call to PageFactory.initElements to initialize elements
B. Incorrect XPath syntax in @FindBy annotation
C. WebElement should be declared as private
D. startButton should be initialized manually with driver.findElement
Solution
Step 1: Check element initialization
The constructor does not call PageFactory.initElements(driver, this), so startButton remains null.
Step 2: Validate other options
XPath syntax is correct. WebElement visibility (private/public) is optional. Manual initialization is not needed if PageFactory is used.
Final Answer:
Missing call to PageFactory.initElements to initialize elements -> Option A
Quick Check:
PageFactory.initElements missing = D [OK]
Hint: Always call PageFactory.initElements in constructor [OK]
Common Mistakes:
Forgetting to initialize elements with PageFactory
Assuming XPath syntax errors without checking
Thinking manual findElement is required with @FindBy
5. You want to locate multiple elements with the same class name using @FindBy. Which declaration is correct to store all matching elements in a list?
public class ProductsPage {
// Which line is correct?
}
hard
A. @FindBy(css = ".product-item")
WebElement products;
B. @FindBy(className = "product-item")
WebElement products;
C. @FindBy(xpath = "//div[@class='product-item']")
WebElement products;
D. @FindBy(className = "product-item")
List<WebElement> products;
Solution
Step 1: Understand locating multiple elements
To store multiple elements, the field must be a List<WebElement>. Using @FindBy with className locator is valid.
Step 2: Check each option's type and locator
@FindBy(className = "product-item")
List<WebElement> products; uses List<WebElement> with correct locator. Options A, B, and D use single WebElement, which can only hold one element.
Final Answer:
@FindBy(className = "product-item")
List<WebElement> products; -> Option D
Quick Check:
Multiple elements need List<WebElement> = C [OK]
Hint: Use List<WebElement> for multiple elements with @FindBy [OK]
Common Mistakes:
Declaring multiple elements as single WebElement
Using wrong locator type for multiple elements
Forgetting to import java.util.List
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.