How to wait for element to load in selenium webdriver?

45,499

Solution 1

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

It will wait for the element to be located for a maximum of 30 seconds if the element is found before that it will execute....

Solution 2

I had to change some small things from @Vicky's answer but this is what I got as a method I could call.

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

and I call it like this:

MyClass.WaitForElementLoad(By.CssSelector("div#div1 div strong a"), 10);
Share:
45,499
user3931772
Author by

user3931772

Updated on November 03, 2020

Comments

  • user3931772
    user3931772 over 3 years

    I am new to selenium webdriver and am testing one application. In my application, I have to test about linking Facebook Account. Whenever I click on link the pop up will be displayed where I have to enter credentials. I am able to link sometimes and sometimes the test fails. I know the reason because it takes time to load pop up window and next command is executed so it is not able to find the element. I have used Thread.Sleep but I want to use implicit wait or explicit wait which is always a good practice rather than Thread.Sleep. How to use implicit wait and where to use that command exactly? Please advice. Thanks.

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

    Sometimes it is not able to find the log in details as pop up is not loaded properly and sometimes it is not able to find sync button as facebook account takes time to link. Please advice.

  • user3931772
    user3931772 over 9 years
    Thread.Sleep is not a good practice to work cause it will wait anyhow even if element is found or not. I tried using implicit wait but its making test fail. Don't know the reason but its not working.
  • tylerlindell
    tylerlindell about 9 years
    thank you for your answer! It helped me find the solution that worked very well for me. I posted my solution here as well.
  • userlond
    userlond over 8 years
    Thanks, It helped me a lot! My second code row looks like wait.Until(ExpectedConditions.VisibilityOfAllElementsLocated‌​By(By.CssSelector("#‌​dummy-div")));
  • Setmax
    Setmax over 4 years
    use TimeSpan.FromSeconds(30) instead of 30