2
votes

Comment attendre qu'un WebElement soit présent dans le DOM?

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) {

    }
}


0 commentaires

6 Réponses :


-3
votes

Vous pouvez peut-être essayer comme ceci:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));


3 commentaires

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 ?



-3
votes

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é .


3 commentaires

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.



2
votes

Quelques problèmes:

  1. La présence signifie qu'il existe dans le DOM mais n'est pas nécessairement visible, cliquable, etc. Si vous voulez que l'élément soit visible, attendez qu'il soit visible.
  2. Vous utilisez * 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.
  3. Vous devriez lire les documents attentivement. Il existe une méthode 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.
    }
}


8 commentaires

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.



0
votes

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']")));


1 commentaires

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.



0
votes

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;
    }


0 commentaires

0
votes

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 () 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:


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 .


0 commentaires