我是 Selenium 的新手。我正在将 Selenium WebDriver 与 Java 一起使用。我正在使用 Eclipse 作为 IDE。我已经为登录页面编写了一些代码,并且运行成功。现在我想在成功登录后转到所需的页面,但我想等待一段时间才能转到另一个页面。如何在加载另一个页面之前等待一个页面?
5 回答
据我所知,有3种方式:
隐式等待:(适用于页面上的所有元素)
driver.manage().timeouts().implicitlyWait(A_GIVEN_NUMBER, TimeUnit.SECONDS);
显式等待:(适用于特定元素)
WebDriverWait.until(CONDITION_THAT_FINDS_AN_ELEMENT);
更具体的代码如下:
WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
使用线程:
Thread.sleep(NUMBER_OF_MILLIS);
我真的建议不要使用 Thread.sleep(NUMBER_OF_MILLS)。它会不稳定,你会遇到睡眠时间不够长的情况。
如果您只是在等待 DOM 加载,那么触发页面加载的 WebDriver 事件将始终等待 DOM 加载后再返回控制。
但是,如果在 DOM 之后使用 AJAX 更改 HTML,那么我建议您使用 WebDriverWait,并等到发生已知事件(例如,对象出现在 html 中,文本更改等)
如果你从这篇文章中拿走一件事,那么请停止使用睡眠!
您可以等到您期望在下一页出现的元素出现。:
WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, TimeSpan(0, 1, 0));
_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
尝试使用隐式等待 60 秒。在 Selenium WebDriver 中如下:
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);//wait for 60 sec.
如果您需要等待更多,请使其成为 80、90 等。
对于 Selenium RC,您可以使用如下代码:
selenium.waitForPageToLoad("60000");//wait for 60 sec.
它可以通过使用线程来完成,如下所示:
Thread.sleep(NUMBER_OF_MILLIS);
对于 WebDriver 中的显式等待,在加载页面中识别一个元素并编写如下代码:
WebDriverWait wait = new WebDriverWait(driver, 40);//wait for 40 sec.
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
我已经使用了这种方法。尝试找出页面上的哪个元素是最后加载的。通过获取该元素的定位器并使用 isDisplayed 检查它的存在,您将能够看到整个页面何时加载