Selenium 2:中断页面加载

点击带有FirefoxDriver的Selenium 2.0b3 Java API的按钮时遇到问题。 点击按钮将表单发送到网络服务器,然后浏览器作为表单提交的结果进入新页面。

当用element.click()点击元素时,selenium正在等待浏览器完成其操作。 浏览器一直等到页面加载完成。 但是,有时由于某些广告请求,页面加载需要很长时间。

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

编辑:

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

点击这个元素。 如果这导致加载新页面,则此方法将阻塞,直到加载页面。

谢谢


尝试firefoxdriver wiki页面最后一部分列出的仅适用于Firefox的测试版功能http://code.google.com/p/selenium/wiki/FirefoxDriver

你至少需要2.9版本,我推荐使用最新版本2.18(2.0b3现在已经快一岁了)!


driver.get()实际上应该阻塞,直到页面加载完成。 但是有时候,例如,如果JavaScript在加载主HTML之后继续加载,则不是。 在这种情况下,您有时会遇到点击尚未出现的元素的问题。 您可以使用WebDriverWait()等待元素出现或增加隐式等待时间:

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

这里是使用WebDriverWait的等价物:

public void waitAndClick(WebDriver driver, By by) {
    WebDriverWait wait = new WebDriverWait(driver, 10000);
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by);
    wait.until(waitForElement);

    Actions builder = new Actions(driver);
    builder.click(driver.findElement(by)).perform();
}

和waitForElement类:

public class waitForElement implements Function<WebDriver, Boolean> {
    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();
}
链接地址: http://www.djcxy.com/p/7799.html

上一篇: Selenium 2: Interrupt a page load

下一篇: How to use Emacs and CEDET with SCons?