How to wait for element to load in selenium webdriver?
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);
user3931772
Updated on November 03, 2020Comments
-
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 over 9 yearsThread.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 about 9 yearsthank you for your answer! It helped me find the solution that worked very well for me. I posted my solution here as well.
-
userlond over 8 yearsThanks, It helped me a lot! My second code row looks like
wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.CssSelector("#dummy-div")));
-
Setmax over 4 yearsuse TimeSpan.FromSeconds(30) instead of 30