如何在selenium webdriver中等待元素加载?

我是selenium webdriver的新手,正在测试一个应用程序。 在我的应用程序中,我必须测试关于Facebook帐户的链接。 每当我点击链接时,弹出窗口都会显示在我必须输入凭据的位置。 我有时能够链接,有时测试失败。 我知道原因是因为加载弹出窗口需要时间并且执行下一个命令所以它无法找到该元素。 我使用过Thread.Sleep,但我想使用隐式等待或显式等待,这总是一个很好的做法,而不是Thread.Sleep。 如何使用隐式等待以及在哪里使用该命令? 请指教。 谢谢。

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

有时它无法找到登录详细信息,因为弹出窗口未正确加载,有时无法找到同步按钮,因为Facebook帐户需要时间链接。 请指教。

WebDriverWait wait = new WebDriverWait(driver,30); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id( “定位器”)));

如果在执行元素之前找到元素,它将等待元素定位最多30秒….

我不得不从@ Vicky的答案中改变一些小东西,但这是我所能得到的一种方法。

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

我称之为:

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

我曾经写过一个函数来检测每秒存在的元素。 如果找到继续,否则抛出超时错误。 但在该function中我仍然使用Thread.Sleep。

期待其他好的解决方案。

我使用ExpectedCondition.visibilityOf(element)而不是线程hibernate

隐式等待 – 最大等待识别对象的时间,它将每500毫秒识别一次对象。 如果它无法在最长时间内识别对象,则会抛出nosuchelementexception。

显式等待 – 用于ajax页面加载用于相同目的。

最长等待时间与thread.sleep相同

为项目写了一个方法:

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

等待应该已经定义了。