WebDriver: Comment vérifier si un élément Web d'objet de page existe?
Comment vérifier si un Élément existe, lors de l'utilisation des Objets de Page avec webdriver.
Jusqu'à présent, je le fais de cette façon.
DefaultPage defaultPage = PageFactory.initElements(this.driver,
DefaultPage.class);
assertTrue(defaultPage.isUserCreateMenuLinkPresent());
Objet De Page:
public class DefaultPage {
@FindBy(id = "link_i_user_create")
private WebElement userCreateMenuLink;
public boolean isUserCreateMenuLinkPresent() {
try {
this.userCreateMenuLink.getTagName();
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}
Mais je ne peux pas croire que ce try/catch est la façon dont on doit le faire. Alors ce serait une meilleure façon de vérifier si les éléments de sorties (avec l'aide des Objets de Page)?
source d'informationauteur Ralph
Vous devez vous connecter pour publier un commentaire.
Webdriver est conçu pour lever une exception si un élément n'est pas trouvé, Donc il n'y a pas de méthodes pour vérifier la présence d'un élément dans Webdriver.
Vérifier ce - http://groups.google.com/group/webdriver/browse_thread/thread/909a9b6cb568e341
Le problème, c'est le modèle lui-même. Il utilise @FindBy annotation (utilisé par PageFactory initialiser les champs qui doivent être enveloppé par Procuration) qui remplace la norme éléments avec leur proxy instances qui contiennent InvocationHandler.
Chaque fois que vous essayez d'accéder à un champ, annotée avec @FindBy, l'invocation de gestionnaire essaie de trouver l'élément à l'aide de la valeur par défaut ElementLocator.Le problème est que le ElementLocator.findElement() la méthode lève une TimeoutException /NoSuchElementException si il n'y a pas les éléments présentés dans les DOM.
Par conséquent, chaque fois que vous devez vérifier si un élément est affiché ou non vous avez à la recherche pour obtenir une Liste des éléments et vérifier la taille.
Une autre façon de résoudre ce problème est de créer votre propre mise en œuvre de LocatingElementHandler et ElementLocator
Donc, si vous avez besoin de votre propre isDisplayed() la méthode renvoie false au lieu d'Exception, vous devez remplacer le findElement() la méthode en ElementLocator avec quelque chose comme ça:
Et d'ajouter de nouvelles conditions de LocatingElementHandler.invoke()
Quelque chose comme:
Je suis en utilisant ce modèle, fonctionne très bien pour moi:
ou:
@Ralph: je le fais de la même façon: try/catch. Je n'ai jamais trouvé un autre moyen.
Vous pourriez changer le bloc try/catch dans une super classe et design, il générique. En d'autres termes: Vous pourriez écrire une méthode qui attend un objet de type WebElement. Cette méthode contient le bloc try/catch et retourner true/false...
J'ai donc écrit une méthode publique dans le framework de test's super classe et je suis maintenant en mesure de l'utiliser dans tous les objet page:
Je ne sais pas pourquoi ce n'est pas implémentée dans WebDriver...
Sinon, vous pouvez utiliser WebDriverWait.
Je suis récemment tombé sur ce vieux post et je pense que je ai trouvé une solution.
J'ai été le tester une page qui a une
Add User
bouton. Lorsque le bouton a été cliqué, divers les champs de texte modifiables apparu (Nom, prénom, Email, etc..) et une seule liste déroulante.Lorsqu'un
Cancel
bouton a été cliqué, les champs ont disparu et n'existaient plus. À l'aide deWebDriverWait
avecExpectedConditions.visibilityOf()
ne fonctionnerait pas puisque les éléments n'existait plus dans leDOM
.J'ai trouvé que
@FindAll
était une solution pour moi, même si je dois admettre que mon test a sensiblement ralentir à ma Liste affirmation.Pour votre code, quelque chose comme ceci:
Je suis en mesure d'utiliser quelque chose de similaire dans mes propres tests, et il semble comme un moyen efficace de contourner le "rien de tel élément' exception. C'est essentiellement un objet de page de l'adaptation d'affirmer:
driver.findElements(By.locator).size() < 1
.À l'aide de C# liaisons:
Vous dites que le Sélénium pour saisir tous les éléments qui correspondent à l'Identifiant et les mettre dans une Liste de
IWebElement
. Vous appelez ensuite.Any()
sur la liste qui s'évalue à true si au moins uneIWebElement
a été trouvé.Arquillian a mis en œuvre cette fonctionnalité dans Le graphène extension.
Vérifier
ElementLocatorConditionFactory.isPresent()
fonction.Ils plus ou moins faire ce que vous avez écrit dans votre question (à partir de
ExpectedConditions.findElement
dans selenium-support.jar) :essayer ce défi est de travailler dans le pom
ce sera certainement le travail de la page de modèle d'objet surround avec try catch