À l'aide de PageObjects, la Page d'Usine et WebDriverWait dans Selenium WebDriver à l'aide de Java

J'ai été en utilisant Selenium WebDriver pour mettre en œuvre des tests fonctionnels pour certains projets que j'ai travaillé avec. Je suis en train d'utiliser la Page de l'Objet modèle de conception de la Page d'Usine pour le facteur de mon locators. J'ai également créé un statique WaitTool objet (singleton) qui implémente plusieurs d'attente techniques avec l'option paramètres de délai d'attente.

Mon problème actuel est que je voudrais utiliser mes méthodes d'attente avant la PageFactory tente d'initialiser le WebElements. La raison pour laquelle je tiens à attendre, c'est parce que le PageFactory peut essayer d'initialiser les éléments de la page avant qu'ils sont disponibles sur la page.

Voici un exemple 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);
    }
}

Voici un exemple 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())));
    }
}

J'ai tendance à mettre ma logique dans la Page de l'Objet autant que possible (y compris les attend), car il rend le cas de test beaucoup plus lisible.

OriginalL'auteur Jamie Piltz | 2013-04-24