Selenium 2:中断页面加载

单击带有Firefox驱动程序的Selenium 2.0b3 Java API的按钮时出现问题。 单击该按钮会将表单发送到Web服务器,然后由于表单提交,浏览器将转到新页面。

当使用element.click()单击元素时,selenium正在等待浏览器完成其操作。 浏览器等待页面加载完成。 但是,由于某些广告请求,有时页面加载会花费大量时间。

如何解决element.click()和页面加载之间的同步问题?

编辑:

正如WebElement javadoc中所解释的那样:

单击此元素。 如果这导致加载新页面,则此方法将阻止,直到页面加载为止。

谢谢

尝试仅针对firefoxdriver wiki页面最后一部分中列出的Firefox的测试版functionhttp://code.google.com/p/selenium/wiki/FirefoxDriver

您至少需要2.9版本,我建议使用最新版本2.18(2.0b3现已快一年了!)

实际上应该阻止driver.get()直到页面加载完毕。 但是,有时它不会在主HTML加载后继续加载JavaScript。 在这种情况下,您有时会遇到单击尚未出现的元素的问题。 您可以使用WebDriverWait()等待元素出现,或者使用以下命令增加隐式等待时间:

driver.manage().timeouts().implicitlyWait(X, TimeUnit.SECONDS); 

这是使用WebDriverWait的等价物:

 public void waitAndClick(WebDriver driver, By by) { WebDriverWait wait = new WebDriverWait(driver, 10000); Function waitForElement = new waitForElement(by); wait.until(waitForElement); Actions builder = new Actions(driver); builder.click(driver.findElement(by)).perform(); } 

和waitForElement类:

 public class waitForElement implements Function { private final By by; private String text = null; public waitForElement(By by) { this.by = by; } public waitForElement(By by, String text) { this.by = by; this.text = text; } @Override public Boolean apply(WebDriver from) { if (this.text != null) { for (WebElement e : from.findElements(this.by)) { if (e.getText().equals(this.text)) { return Boolean.TRUE; } } return Boolean.FALSE; } else { try { from.findElement(this.by); } catch (Exception e) { return Boolean.FALSE; } return Boolean.TRUE; } } } 

这是完全未经测试的,但我想我会把它丢给你。 我想也许你可以通过构建自定义动作来解决它。

 protected static void maybeAsyncClick(WebElement element, WebDriver driver) { Actions builder = new Actions(driver); Action newClick = builder.moveToElement(element) .click() .build(); newClick.perform(); }