【问题标题】:Selenium 2: Interrupt a page loadSelenium 2:中断页面加载
【发布时间】:2011-09-16 19:13:39
【问题描述】:

我在单击带有 FirefoxDriver 的 Selenium 2.0b3 Java API 的按钮时遇到问题。单击该按钮会向网络服务器发送一个表单,然后浏览器会作为表单提交的结果转到一个新页面。

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

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

编辑:

WebElement javadoc中所述:

单击此元素。如果这导致 要加载新页面,此方法将 阻塞直到页面加载完毕。

谢谢

【问题讨论】:

    标签: java selenium-webdriver


    【解决方案1】:

    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;
            }
        }
    }
    

    【讨论】:

    • 迈克,我编辑了这个问题。问题不在于隐式等待。我不是在等待一个元素出现。我单击一个元素,然后才发生页面加载。这种负载困扰着我,因为为我的测试加载无用元素可能需要很长时间。
    • 我不知道执行异步 get() 的内置方法。但是,您可以通过启动一个新线程来执行 get() 来相当容易地做到这一点
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      仅在 firefoxdriver wiki 页面 http://code.google.com/p/selenium/wiki/FirefoxDriver 的最后一部分列出的 Firefox 中试用 beta 功能

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

      【讨论】:

      • 这就像一个魅力!我让它隐式等待大约 30 秒(对于快速的互联网连接应该足够了),它能够继续进行而无需等待滞后的元素。 +1 先生。
      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多