web-dev-qa-db-fra.com

Comment attendre que l'élément se charge dans le WebDriver Selenium?

Je suis nouveau sur le webdriver Selenium et je teste une application. Dans ma candidature, je dois tester la possibilité de lier un compte Facebook. Chaque fois que je clique sur le lien, la fenêtre contextuelle s’affiche où je dois saisir les informations d’identité. Je suis capable de lier parfois et parfois le test échoue. Je connais la raison parce que le chargement de la fenêtre contextuelle prend du temps et que la commande suivante est exécutée afin de ne pas pouvoir trouver l'élément. J'ai utilisé Thread.Sleep mais je souhaite utiliser l'attente implicite ou l'attente explicite, ce qui est toujours une bonne pratique plutôt que Thread.Sleep. Comment utiliser l'attente implicite et où utiliser cette commande exactement? S'il vous plaît des conseils. Merci.

 public void SocialFaceBook()
    {           
        string currentWindow = driver.CurrentWindowHandle;
        PopupWindowFinder Finder = new PopupWindowFinder(driver);
        string facebookWindow = Finder.Click(driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[3]/a")));
        // Switch To FaceBook Window
        driver.SwitchTo().Window(facebookWindow);
        System.Threading.Thread.Sleep(3000);

        // Link
        // Email Address
        IWebElement faceBookLinkEmail = driver.FindElement(By.Id("email"));
        faceBookLinkEmail.SendKeys(SocialFaceBookEmail);

        // Password
        IWebElement faceBookLinkPass = driver.FindElement(By.Id("pass"));
        faceBookLinkPass.SendKeys(SocialFaceBookPass);

        // Log In Button
        IWebElement faceBookLinkLogin = driver.FindElement(By.XPath("//input[@id='u_0_1']"));
        faceBookLinkLogin.Click();

        // Switch To Main Window
        driver.SwitchTo().Window(currentWindow);
        System.Threading.Thread.Sleep(3000);

        // Sync            
        IWebElement faceBookSync = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[2]/a"));
        faceBookSync.Click();

        // Unlink
        IWebElement faceBookUnLink = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[1]/a"));
        faceBookUnLink.Click();
    }

Parfois, il est impossible de trouver le journal dans les détails car la fenêtre contextuelle n'est pas chargée correctement et parfois, il est impossible de trouver le bouton de synchronisation, car la connexion d'un compte Facebook prend du temps. S'il vous plaît des conseils.

6
user3931772

WebDriverWait wait = new WebDriverWait (pilote, 30); Wait.until (ExpectedConditions.visibilityOfElementLocated (By.id ("locator")));

Il attendra que l’élément soit localisé pendant au maximum 30 secondes si l’élément est trouvé avant de s’exécuter ....

17
Vicky

J'ai dû changer quelques petites choses de la réponse de @ Vicky, mais c'est ce que j'ai comme méthode pour appeler.

public static void WaitForElementLoad(By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(timeoutInSeconds));
            wait.Until(ExpectedConditions.ElementIsVisible(by));
        }
    }

et je l'appelle comme ça:

MyClass.WaitForElementLoad(By.CssSelector("div#div1 div strong a"), 10);
3
tylerlindell

J'avais l'habitude d'écrire une fonction pour détecter un élément existe chaque seconde. si trouver continue, sinon erreur de timeout jeté. mais dans cette fonction, j'utilise toujours Thread.Sleep. 

Attendez-vous à une autre bonne solution. 

0
Dexter Yao

J'utilise ExpectedCondition.visibilityOf (élément) au lieu de thread dort

0
bcar

A écrit une méthode pour un projet:

public static void WaitForElementPresentBy(By by)
        {
            try
            {
                Wait.Until(ExpectedConditions.ElementIsVisible(by));
            }
            catch (TimeoutException te)
            {

                Assert.Fail("The element with selector {0} didn't appear. The exception was:\n {1}", by, te.ToString());
            }
        }

Wait devrait déjà avoir été défini.

0
Ukrainis

Attente implicite - temps d'attente maximal pour identifier l'objet, il l'identifiera toutes les 500 ms. s'il ne parvient pas à identifier l'objet dans le délai maximal, il lève une exception nosuchelement.

Attente explicite - utilisée pour les chargements de page ajax dans le même but.

le temps d'attente maximum est identique à thread.sleep

0
venkat