How to use property file value in PageFactory @FindBy annotation? – Java

Photo of author
Written By M Ibrahim
azure-java-sdk selenium-webdriver

Quick Fix: Currently it isn’t possible to achieve. But you can contribute a solution by writing code and offering it to the Selenium community to apply as a patch to be included in the codebase.

The Problem:

In Selenium2, when using the Page Object Pattern along with Page Factory, how can one utilize the @FindBy Annotation with a property file containing the locators?

The Solutions:

Solution 1: Not Applicable

\n

It is not possible to utilize property file values within the @FindBy annotation of PageFactory. The annotation only allows constant expressions. There is no workaround available for this scenario. For now, you cannot use property file values in the @FindBy annotation.

Solution 2: Reading Locators from a Properties File

It is possible to use a properties file to store the locator values for your @FindBy annotations. Here’s how you can do this:

  1. Create a properties file, such as ‘locators.properties’, and populate it with the locator values for your web elements.
  2. In your Page Object class, define a method to load the properties file and retrieve the locator values.
  3. In your @FindBy annotations, use the getLocatorValue() method to retrieve the locator value from the properties file.

Here’s an example of how you can implement this:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class LoginPage {

    protected WebDriver driver;

    private Properties locators;

    @FindBy(id = getLocatorValue("login.usernameField"))
    private WebElement usernameField;

    @FindBy(id = getLocatorValue("login.passwordField"))
    private WebElement passwordField;

    @FindBy(id = getLocatorValue("login.loginButton"))
    private WebElement loginButton;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
        locators = loadLocators();
    }

    private Properties loadLocators() {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("locators.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }

    private String getLocatorValue(String key) {
        return locators.getProperty(key);
    }
}

With this approach, you can keep the locators in a separate file, which makes it easier to maintain and update them.