Actuellement, je recherche une solution pour attendre qu'un WebElement spécifique soit présent dans le DOM des sites Web.
Actuellement, j'ai configuré la méthode ci-dessous qui utilise un localisateur By mais je cherche à utiliser un WebElement à la place, des idées?
Selon les JavaDocs:
public static ExpectedCondition visibilitéOf (élément WebElement): Une attente pour vérifier qu'un élément, connu pour être présent sur le DOM d'une page, est visible. La visibilité signifie que l'élément est non seulement affiché, mais a également une hauteur et une largeur supérieures à 0.
Cette méthode existante ci-dessus, vérifie que l'élément est visible et également présent dans le DOM mais pas seulement présent dans le DOM.
Méthode actuelle qui utilise By au lieu de WebElement: Je peux voir en lisant la documentation sur le sélénium que vous pouvez attendre que la présence d'un élément soit visible dans le DOM;
Un exemple:
public static void waitForElementToAppearInDOM(By by, int timer) { try { WebDriver driver = getDriver(); WebDriverWait exists = new WebDriverWait(driver, timer); exists.until(ExpectedConditions.presenceOfAllElementsLocatedBy(by)); } catch(Exception e) { } }
6 Réponses :
Vous pouvez peut-être essayer comme ceci:
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
J'ai peur qu'il utilise toujours By au lieu de WebElement.
je pense qu'il n'y a pas de différence
@dudycoco Vous pensez qu'il n'y a pas de différence entre un By
et un WebElement
?
Dans votre code, vous devriez avoir le "ID" ou "xpath" comme localisateur. Consultez la documentation sur Conditions attendues La ligne 5 ressemblerait à:
exists.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By, locator));
Regardez aussi cette présence de élément différent de la visibilité .
c'est correct, mais je cherche à remplacer par WebElement.
ok, vous pouvez le faire. Recherchez l'ID de l'élément Web. Remplacez «locator» par «ID». Reportez-vous à la documentation, regardez également 'visibilitéOf (élément WebElement)'
le problème avec la visibilitéOf, il effectue deux vérifications: «La visibilité signifie que l'élément est non seulement affiché mais a également une hauteur et une largeur supérieures à 0.» au lieu de valider uniquement l'élément dans le DOM.
Quelques problèmes:
* Elements *
qui est au pluriel qui attendra TOUS les éléments trouvés par le localisateur, pas seulement celui que vous recherchez spécifiquement. Cela peut conduire à des échecs confus, etc. si vous ne disposez pas d'un localisateur unique. J'éviterais d'utiliser le pluriel si vous ne voulez que le singulier. ExpectedConditions
qui fait exactement ce que vous recherchez. public static ExpectedCondition visibilitéOf (élément WebElement)
Votre code devrait ressembler davantage à
public static void waitForElementToAppearInDOM(WebElement element, int timer) { try { new WebDriverWait(getDriver(), timer).until(ExpectedConditions.visibilityOf(element)); } catch(Exception e) { // don't leave an empty catch, do something with it or don't catch it. } }
les références java docs: «La visibilité signifie que l'élément n'est pas seulement affiché, mais a également une hauteur et une largeur supérieures à 0.»
@SamP Je ne comprends pas votre point. Si l'élément est "visible" mais est de 0 largeur x 0 hauteur, il n'est pas vraiment visible, n'est-ce pas?
mon point est que j'essaie de valider uniquement si un élément est présent dans le DOM, pas s'il est visible, par exemple si un conteneur div spécifique est répertorié dans le dom avec une opacité de 0, afficher comme aucun, etc., il sera toujours répertorié dans le DOM cependant du point de vue des utilisateurs, ils ne verront pas la balise div spécifique.
@SamP Votre confusion entre la présence et la visibilité nous embrouille en tant que lecteurs et rend difficile la compréhension et la réponse à votre question. Présence signifie que l'élément est dans le DOM mais n'est pas nécessairement visible, cliquable, etc. Visible signifie que l'élément peut être vu .. est visible et a une hauteur et une largeur. Maintenant, votre question, telle qu'elle est écrite en ce moment est Comment attendre qu'un WebElement soit ** VISIBLE ** dans le DOM?
qui indique clairement que vous recherchez une présence visible et pas seulement. Veuillez clarifier et modifier votre question si vous changez d'avis.
@SamP est-ce que visibilitéOf applique une logique et pour vérifier la présence et la visibilité? Par exemple, si l'un échoue, l'autre échouera également.
@SamP Un élément peut-il être visible sans être présent?
@SamP Je ne comprends pas pourquoi vous voulez même ça. Si vous avez déjà localisé un élément, pourquoi avez-vous besoin de vérifier sa présence? Si ce n'était pas là, vous n'auriez pas pu le localiser en premier lieu. Si la page change et que vous essayez d'éviter les StaleElementException
, alors ce n'est pas la bonne façon de le faire. Cela ressemble à le problème XY . Plutôt que d'essayer d'obtenir la solution spécifique que vous recherchez, décrivez plutôt le problème global que vous essayez de résoudre. Il y a certainement une meilleure façon de résoudre ce problème que celle-ci.
les éléments peuvent toujours être chargés dans le DOM même avec une hauteur et une largeur CSS de 0, je gère déjà StaleElementExceptions.
Cette méthode "visibilitéOfElementLocated" utilise By:
Exemple: // Attendre l'élément visible
WebDriverWait wait = new WebDriverWait(driver, 15); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='text3']")));
Veuillez ne pas publier plusieurs réponses à la même question. Rassemblez plutôt toutes vos idées et publiez via une seule réponse canonique. Supprimez enfin la réponse redondante.
Comment vérifier la présence avec WebElement
comme paramètre.
public boolean isElementPresent(WebElement element) { if (element != null) { try { //this line checks the visibility but it's not returned. //It's to perform any operation on the WebElement element.isDisplayed(); return true; } catch (NoSuchElementException e) { return false; } } else return false; }
Vous étiez assez correct jusqu'à ce que public static ExpectedCondition visibilitéOf (élément WebElement): Une attente pour vérifier qu'un élément, connu pour être présent sur le DOM d'une page, est visible. La visibilité signifie que l'élément est non seulement affiché mais a également une hauteur et une largeur supérieures à 0. Cette méthode existante ci-dessus, vérifie que l'élément est visible et également présent dans le DOM mais pas seulement présent dans le DOM .
Pour simplifier, je reformulerais cette ExpectedCondition comme l'attente de vérifier l'élément connu pour être présent dans le DOM d'une page, est visible .
De-grossier les deux attentes presenceOfElementLocated ()
et visibilitéOf ()
ont beaucoup de différences entre elles.
Pour en revenir à votre question principale, attendre qu'un WebElement spécifique soit présent en utilisant WebElement comme argument n'est pas possible . La raison est simple car le WebElement doit encore être identifié dans le DOM, qui ne sera identifié qu'après l'attente de presenceOfElementLocated
ou findElement () code > réussit.
Ce concept est brusquement soutenu par la liste des ExpectedCondition dans les JavaDocs liés à la présence d'élément (s) qui sont les suivants:
presenceOfAllElementsLocatedBy (Par localisateur)
presenceOfElementLocated (Par localisateur)
presenceOfNestedElementLocatedBy (Par localisateur, Par childLocator)
presenceOfNestedElementLocatedBy (élément WebElement, par childLocator)
presenceOfNestedElementsLocatedBy (Par parent, Par childLocator)
Pour conclure, vous ne pouvez pas passer un WebElement comme argument en tant qu'attente comme presenceOfElementLocated ()
car le WebElement ne l'a pas encore être indentifié. Mais une fois que l'élément est identifié via findElement ()
ou presenceOfElementLocated ()
ce WebElement peut recevoir un argument.
Pour résumer:
presenceOfElementLocated (By locator)
: Cette attente est de vérifier qu'un élément est présent dans le DOM d'un page. Cela ne signifie pas nécessairement que l'élément est visible
visibilitéOf (élément WebElement)
: Cette attente est de vérifier qu'un élément, connu pour être présent sur le DOM d'une page, est visible . La visibilité signifie que l'élément est non seulement affiché , mais a également une hauteur et une largeur qui est supérieure à 0 .