Usando PageObjects, Page Factory y WebDriverWait en Selenium WebDriver usando Java

He estado usando Selenium WebDriver para implementar pruebas funcionales para algunos proyectos con los que he trabajado. Estoy tratando de usar el patrón de diseño Page Object con Page Factory para factorizar mis localizadores. También he creado un objeto estático WaitTool (singleton) que implementa varias técnicas de espera con parámetros de tiempo de espera opcionales.

Mi problema actual es que me gustaría usar mis métodos de espera antes de que PageFactory intente inicializar WebElements. La razón por la que me gustaría esperar es porque PageFactory puede intentar inicializar los elementos de la página antes de que estén disponibles en la página.

Aquí hay un ejemplo de PageObject:

public class SignInPage extends PageBase {
    @FindBy(id = "username")
    @CacheLookup
    private WebElement usernameField;

    @FindBy(id = "password")
    @CacheLookup
    private WebElement passwordField;

    @FindBy(name = "submit")
    @CacheLookup
    private WebElement signInButton;

    public SignInPage(WebDriver driver) {
        super(driver);

        WaitTool.waitForPageToLoad(driver, this);

        // I'd like initialisation to occur here
    }

    public MainPage signInWithValidCredentials(String username, String password){
        return signIn(username, password, MainPage.class);
    }

    private <T>T signIn(String username, String password, Class<T> expectedPage) {
        usernameField.type(username);
        passwordField.type(password);
        signInButton.click();

        return PageFactory.initElements(driver, expectedPage);
    }
}

Aquí hay un ejemplo de TestObject:

public class SignInTest extends TestBase {
    @Test
    public void SignInWithValidCredentialsTest() {
        SignInPage signInPage = PageFactory.initElements(driver, SignInPage.class);

        MainPage mainPage = signInPage.signInWithValidCredentials("sbrown", "sbrown");

        assertThat(mainPage.getTitle(), is(equalTo(driver.getTitle())));
    }
}

Tiendo a poner mi lógica en el Objeto de página tanto como sea posible (incluidas las esperas), ya que hace que los casos de prueba sean mucho más legibles.

Respuestas a la pregunta(1)

Su respuesta a la pregunta