在 Webdriver 中提交表单后如何等待页面加载。我正在使用 Firefox 驱动程序

Posted

技术标签:

【中文标题】在 Webdriver 中提交表单后如何等待页面加载。我正在使用 Firefox 驱动程序【英文标题】:How do i wait for a page to load after a form submits in Webdriver. I am using firefox driver 【发布时间】:2011-09-04 12:22:00 【问题描述】:

我正在尝试自动化一个测试用例,在该测试用例中我通过单击图像来提交表单。

页面重新加载后,我无法与网页上的任何元素进行交互

我用的是java,firefox驱动。

代码卡住了,根本无法识别元素。

webdriver 有没有像 QTP 和 selenium 那样的等待机制?

【问题讨论】:

【参考方案1】:

2 年后,ruby 实现:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.util 
  @driver.execute_script("return document.readyState;") == "complete" 

【讨论】:

酷。但是当前版本确实可以很好地处理页面转换加载! @ThiagoFMacedo 我不能代表 Linux,但我的经验不是它在 Windows 上处理得很好。我们做了类似 allenhwkim 建议的事情。 那里有一个错字。它应该是 wait.until,而不是 util。【参考方案2】:

只需使用FluentWait 类:

/**
 * An implementation of the @link Wait interface that may have its timeout
 * and polling interval configured on the fly.
 *
 * <p>Each FluentWait instance defines the maximum amount of time to wait for
 * a condition, as well as the frequency with which to check the condition.
 * Furthermore, the user may configure the wait to ignore specific types of
 * exceptions whilst waiting, such as
 * @link org.openqa.selenium.NoSuchElementException NoSuchElementExceptions
 * when searching for an element on the page.
 *
 * <p>Sample usage:
 * <code><pre>
 *   // Waiting 30 seconds for an element to be present on the page, checking
 *   // for its presence once every 5 seconds.
 *   Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
 *       .withTimeout(30, SECONDS)
 *       .pollingEvery(5, SECONDS)
 *       .ignoring(NoSuchElementException.class);
 *
 *   WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
 *     public WebElement apply(WebDriver driver) 
 *       return driver.findElement(By.id("foo"));
 *     
 *   );
 *

或WebDriverWait。

【讨论】:

这是一个新课程吗?我有 2.39(c# 绑定),但它似乎不存在。这来自什么dll?也许我错过了一个【参考方案3】:

我认为使用 selenium 2,您无需在使用 Firefox webdriver 提交表单后等待。

     element.sendKeys("34344343");
     webDriver.findElement(By.id("searchSubmitButton")).click();

WebElement columnInPostedPage =  webDriver.findElement(By.xpath("//div[@id='content']/table/tbody/tr[2]/td[3]")); //

如果页面加载后通过javascript加载内容,您可以对内容执行类似的操作

     query.submit();

    long end = System.currentTimeMillis() + 5000;
    while (System.currentTimeMillis() < end) 
        WebElement result = webDriver.findElement(By.id("content"));
        if (result.isDisplayed()) 
          break;
        
        //Thread.sleep(1000);
            

     WebElement columnInPostedPage =  webDriver.findElement(By.xpath("//div[@id='content']/table/tbody/tr[2]/td[3]")); //

【讨论】:

Selenium 2 是否会在click() 之后等待取决于页面的加载方式。 我认为异常会让你跳出时间循环。我认为这行不通。您需要使用带有 .ignoring 方法的 WebDriverWait。【参考方案4】:

http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/

waitForpageLoad()

【讨论】:

我猜在使用 selenium RC 时会使用 waitForPageLoad。 Webdriver 是怎么回事?我正在使用 Firefox 驱动程序....我做了一些尝试和错误,似乎每当我们提交表单时都不需要写任何东西。有人可以评论吗 见***.com/questions/10720325/…【参考方案5】:
for (int second = 0;; second++) 
            if (second >= 60) fail("timeout");
            try  if (isElementPresent(By.linkText("element"))) break;  catch (Exception e) 
            Thread.sleep(1000);
        

【讨论】:

-1:Webdriver 有隐式和显式等待的方法:here 谢谢你的答案。将来会更多地了解硒

以上是关于在 Webdriver 中提交表单后如何等待页面加载。我正在使用 Firefox 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

php 在自己本身的页面如何防止重复提交的

等待页面重定向 Selenium WebDriver (Python)

求助:PHP多表单提交问题,一个页面提交N多个表单

如何等待 WEBdriver.io 的 Ajax 调用完成

在goahead中如何实现在一个页面提交表单数据,在另一个页面获取表单提交过来的数据

在DW中制作一个表单后如何使表单内容提交到指定页面?