In my case, I only use the AjaxElementLocatorFactory in the
constructor of my page objects.
Please see example below. Hopefully it will give you some idea of the
usage.
/***
* This is the parent class where shared services are available.
***/
public abstract class AbstractParentPage {
public int DRIVER_WAIT = 30; // 30 seconds
/***
* Constructor
* @param driver an instance of WebDriver
*/
public AbstractAIPage(WebDriver driver){
ElementLocatorFactory finder = new
AjaxElementLocatorFactory(driver,
DRIVER_WAIT);
PageFactory.initElements(finder, this);
this.driver = driver;
}
------ Add services accessible to all pages here ----
}
/***
* This is the login page
***/
public class LoginPage extends AbstractParentPage{
@FindBy(id = "username")
private WebElement usernameTextBox;
@FindBy(id = "password")
private WebElement passwordTextBox;
/***
* constructor
* @param driver an instance of WebDriver
*/
public LoginPage(WebDriver driver) {
super(driver);
ElementLocatorFactory finder = new
AjaxElementLocatorFactory(driver, DRIVER_WAIT);
PageFactory.initElements(finder, this);
this.driver = driver;
}
public HomePage login(String username, String password){
usernameTextBox.clear();
usernameTextBox.sendKeys(username);
passwordTextBox.clear();
passwordTextBox.sendKeys(password);
passwordTextBox.submit();
return new HomePage(driver);
}
}
------------------------------------------------------------------
Test Code:
WebDriver driver = new FirefoxDriver();
LoginPage loginPage = new LoginPage(driver);
HomePage homePage = loginPage.login("username","password");
In test code, only services in page objects are accessed. With the use
of AjaxElementLocatorFactory in page object constructor, webdriver
waits for a web element the specified time in DRIVER_WAIT (30 seconds
in the example above) before timing out and throwing No Such Element
Found exception.