À 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
Vous devez vous connecter pour publier un commentaire.
La WebElements dans un PageFactroy sont vraiment des procurations pour WebElements. Cela signifie que chaque fois que vous accédez à un WebElement, il va effectuer une recherche pour trouver l'élément sur la page.
Cela présente certains avantages:
Vous utilisez le @CacheLookup annotation qui est en train de perdre la seconde prestation qu'il va trouver l'élément une fois, puis de conserver une référence à elle, vous êtes beaucoup plus susceptibles de voir StaleElementExceptions.
Cela étant dit, vous gardez toujours le principal avantage qui est que le Sélénium n'ira pas à la page et de trouver réellement l'élément jusqu'à la première utilisation.
Donc en résumé tout ce que vous devez faire est de déplacer
Dans votre constructeur et ce sera très bien.
PageFactory.initElements(driver, expectedPage)
dans le signIn fonction.PageFactory.initElements(driver, this.class);
ne semble pas fonctionner. la fourniture dethis
outhis.getClass()
fonctionne cependant, mais je ne suis pas sûr si c'est pour faire ce que je veux.Désolé c'est une erreur dans ma réponse. En fait je voulais dire c' (réponse mis à jour pour montrer le bon extrait de Code)
Si je suis à vous comprendre correctement vous êtes juste inquiet que lors de l'instanciation de la classe, il va commencer à jeter un NoSuchElementExcpetion erreur parce que la page ne peut pas avoir chargé tous les WebElements que le PageFactory se réfère. Si c'est votre ne vous inquiétez pas, cela n'arrivera pas. Lorsque vous effectuez un " PageFactory.initElements(pilote, this); " c'est alors à ce moment de configurer le nombre de mandats, mais il ne sera pas essayer et de trouver l'élément sur la page jusqu'à ce que vous utilisez réellement l'un des WebElements.
Après j'ai lu ce post et vos commentaires, j'ai une question. Ce n'procurations dans ce cas signifie?
OriginalL'auteur Ardesco