如何在使用 Java 转到 Selenium WebDriver 中的另一个页面之前等待一个页面?

Posted

技术标签:

【中文标题】如何在使用 Java 转到 Selenium WebDriver 中的另一个页面之前等待一个页面?【英文标题】:How to wait a page before going to another page in Selenium WebDriver using Java? 【发布时间】:2013-08-25 00:04:26 【问题描述】:

我是 Selenium 的新手。我正在将 Selenium WebDriver 与 Java 一起使用。我正在使用 Eclipse 作为 IDE。我已经为登录页面编写了一些代码,并且运行成功。现在我想在成功登录后转到所需的页面,但我想等待一段时间才能转到另一个页面。如何在加载另一个页面之前等待一个页面?

【问题讨论】:

你在用什么? Selenium RC 还是 Selenium WebDriver? 【参考方案1】:

我使用过这种方法。尝试找出页面上的哪个元素是最后加载的。通过获取该元素的定位器并使用 isDisplayed 检查它的存在性,您将能够看到整个页面何时加载

【讨论】:

【参考方案2】:

尝试使用隐式等待 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")));

【讨论】:

【参考方案3】:

据我所知,有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_MILLIS);现在它正在工作。谢谢马巴斯。 WebDriverWait 最好等待一个元素。在这种情况下,它需要识别着陆页的一个元素。 语句中的数字40代表什么:WebDriverWait wait = new WebDriverWait(driver, 40); @TejeshRaut 调用期望时的超时秒数【参考方案4】:

我真的建议不要使用 Thread.sleep(NUMBER_OF_MILLS)。它会不稳定,你会遇到睡眠时间不够长的情况。

如果您只是等待 DOM 加载,那么触发页面加载的 WebDriver 事件将始终等待 DOM 加载后返回控制权。

但是,如果在 DOM 之后使用 AJAX 来更改 html,那么我建议你使用 WebDriverWait,并等待已知事件发生(例如,对象出现在 html 中,文本更改等)

如果你从这篇文章中拿走一件事,那么请停止使用睡眠!

【讨论】:

【参考方案5】:

使用类WebDriverWait

Selenium explicit / implicit wait

您可以等到您期望在下一页出现的元素出现。 :

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));

【讨论】:

这会在Until 方法中引发无法定位元素异常。

以上是关于如何在使用 Java 转到 Selenium WebDriver 中的另一个页面之前等待一个页面?的主要内容,如果未能解决你的问题,请参考以下文章

PYTHON + SELENIUM(CHROME):如何从当前网址中提取特定文本并使用提取的文本转到另一个文本?

TestNG,Selenium 如何在多个类之间共享对象

Selenium WebDriver如何使滚动条滚动到最元素位置

Selenium用法详解窗口表单切换JAVA爬虫

Selenium 等到文档准备好

使用 Selenium (webdriver java cucumber) 断言滚动条的存在