4
votes

Comment attendre l'invisibilité d'un élément via PageFactory en utilisant Selenium et Java

Existe-t-il un moyen d'attendre un élément non présent dans Selenium en utilisant les annotations PageFactory?

Lors de l'utilisation de:

wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('loading-content')));

pour localiser l'élément, puis:

org.opeqa.selenium.WebElement cannot be converted to org.openqa.selenium.By

J'obtiendrais:

wait.until(ExpectedConditions.invisibilityOfElementLocated(pleaseWait));

Je peux faire ce dont j'ai besoin en utilisant:

@FindBy(css= '#loading-content')
WebElement pleaseWait;

Cependant, j'aimerais pouvoir utiliser les annotations PageFactory afin de garder le framework cohérent. Y a-t-il un moyen de faire cela?


0 commentaires

3 Réponses :


2
votes

invisibilityOfElementLocated attend un localisateur mais vous envoyez un élément Web et c'est pourquoi il génère une erreur. Vous pouvez effectuer l'opération en vérifiant la liste des éléments Web en utilisant:

if(pleaseWait.size()==0){
     System.out.println("Element is not visible on the page");
     // Add the further code here
}

Réponse mise à jour:
Si vous souhaitez vérifier que l'élément n'est pas présent sur la page, vous pouvez vérifier que sa taille de liste est égale à 0 ou non, car sa taille de liste sera de 0 lorsqu'elle n'est pas affichée sur l'interface utilisateur.

Vous pouvez obtenir la liste des éléments en utilisant:

@FindBy(css='#loading-content')
List<WebElement> pleaseWait;

Et vous pouvez vérifier que la taille de la liste est égale à 0 en utilisant:

wait.until(ExpectedConditions.invisibilityOfAllElements(Arrays.asList(pleaseWait)));

Et cela ne donnerait pas non plus d'exception à NoSuchElement.


8 commentaires

Non, ça ne marche pas. J'obtiens La condition attendue a échoué: attente de l'invisibilité de tous les éléments [Élément proxy pour: DefaultElementLocator 'By.cssSelector: # loading-content'] (essayé pendant 5 seconde (s) avec un intervalle de 500 millisecondes) . Cependant, il semble que la prochaine étape soit en cours d'exécution.


Oui, donc je suppose que cela a donné l'erreur car il s'attendait à ce que l'élément soit invisible mais il est visible.


Parce que la méthode a fonctionné et que la ligne de code suivante a également été exécutée.


Ceci est la suite du message ci-dessus: Causé par: org.openqa.selenium.NoSuchElementException: aucun élément de ce type: impossible de localiser l'élément: {"method": "css selector", "selector": "# loading- content "} . Je ne pense pas que cela a fonctionné comme prévu. Pourquoi lancerait-il une exception?


Si vous obtenez NoSuchElementException , cela signifie soit que l'élément n'est pas visible sur la page, soit que votre css est incorrect à travers lequel vous trouvez l'élément. Veuillez me dire quel est le scénario que vous souhaitez vérifier ici, je serais en mesure de mieux vous aider.


Un élément «veuillez patienter pendant le chargement» est présent pendant le chargement de la page. J'attends le chargement de la page avant de cliquer sur un élément. Le localisateur est correct, mais je soupçonne qu'il est en quelque sorte trop rapide pour que le sélénium le remarque.


J'ai mis à jour par réponse, veuillez vérifier que, j'ai publié une approche alternative pour résoudre votre problème.


S'il vous plaît essayez cela et faites-moi savoir si cela aide :)



1
votes

Vous pouvez également utiliser la condition attendue correcte:

wait.until(ExpectedConditions.invisibilityOf(pleaseWait));

Référence .

J'espère que cela vous aidera! p >


3 commentaires

J'attends que l'élément non soit visible.


@ MateMrše, oui, je vois. J'ai mis à jour ma réponse. Vérifiez-le, s'il vous plaît, encore une fois. Merci.


J'obtiens La condition attendue a échoué: en attente d'invisibilité de l'élément Proxy pour: DefaultElementLocator 'By.cssSelector: # loading-content' (essayé pendant 5 seconde (s) avec un intervalle de 500 millisecondes) message d'erreur. Il semble que cet élément a disparu trop rapidement.



2
votes

Lorsque vous utilisez PageFactory dans PageObjectModel si vous vous attendez à ce que l'élément soit invisible , vous pouvez utiliser l ' Attente explicite em > support avec une fabrique de localisateurs normale et utilisez l'une des solutions suivantes:


invisibilityOfElementLocated ()

invisibilityOfElementLocated () est l'implémentation d'une attente pour vérifier qu'un élément est soit invisible, soit absent du DOM. Il est défini comme suit:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;

public class fooPage {

    WebDriver driver;
    public fooPage(WebDriver driver)
    {
        PageFactory.initElements(driver, this);
    }


    @FindBy(css= '#loading-content')
    WebElement pleaseWait;

    public void foo()
    {
        Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(fooPage.getWebElement()));
        //other lines of code
    }

    public WebElement getWebElement()
    {
        return pleaseWait;
    }
}
  • Bloc de code:

    public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)
    An expectation for checking the element to be invisible
    
    Parameters:
        element - used to check its invisibility
    
    Returns:
        Boolean true when elements is not visible anymore
    

Comme alternative, vous pouvez également utiliser la méthode invisibilityOf () comme suit:

invisibilityOf ()

invisibilityOf () est l'implémentation d'une attente pour vérifier que l'élément est invisible. Il est défini comme suit:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;

public class fooPage {

    WebDriver driver;
    public fooPage(WebDriver driver)
    {
        PageFactory.initElements(driver, this);
    }

    //you don't need this
    //@FindBy(css= '#loading-content')
    //WebElement pleaseWait;

    public void foo()
    {
        Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('#loading-content')));
        //other lines of code
    }
}
  • Bloc de code:

    public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)
    An expectation for checking that an element is either invisible or not present on the DOM.
    
    Parameters:
        locator - used to find the element
    
    Returns:
        true if the element is not displayed or the element doesn't exist or stale element
    

Vous pouvez trouver une discussion détaillée dans Comment utiliser explicite attend avec les champs PageFactory et le modèle PageObject


0 commentaires