Selenium.click等待动作完成超时

时间:2012-05-07 17:51:52

标签: selenium webdriver selenium-rc

我在Eclipse中使用Java运行selenium RC。我遇到的问题是使用selenium.click命令。我点击的链接会加载一个新页面。有时需要5秒钟,有时需要2-3分钟。每当我看到页面加载并且在我的测试失败后立即收到消息“我等待完成等待操作的时间。”

我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会通过selenium.click甚至达到检查元素的程度。根据我的理解,selenium.click命令中内置了一个等待。所以我的问题是,有没有人知道如何忽略内置等待,所以我可以改为使用selenium.isElementPresent?

selenium.click(Link);
for (int i = 0; i < 60 ; i++) {
    if (selenium.isElementPresent(Home)) {
       break;
    }
    Thread.sleep(1000);
}

我还尝试使用selenium.open直接转到URL并完全跳过链接,然后使用selenium.isElementPresent来验证页面是否已加载。我在那里得到了同样的问题,在失败之前它从未实际进入for循环。

3 个答案:

答案 0 :(得分:1)

我遇到过同样的问题。我只是使用try / catch包含click命令,以便捕获错误,然后执行断言标题并检查页面上的预期文本。

答案 1 :(得分:1)

我建议您将此方法/功能合并到代码中。

    public static void WaitForPageToLoad(IWebDriver driver)
    {
        TimeSpan timeout = new TimeSpan(0, 0, 2400);
        WebDriverWait wait = new WebDriverWait(driver, timeout);

        IJavaScriptExecutor javascript = driver as IJavaScriptExecutor;
        if (javascript == null)
            throw new ArgumentException("driver", "Driver must support javascript execution");

        wait.Until((d) =>
        {
            try
            {
                string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString();
                return readyState.ToLower() == "complete";
            }
            catch (InvalidOperationException e)
            {
                //Window is no longer available
                return e.Message.ToLower().Contains("unable to get browser");
            }
            catch (WebDriverException e)
            {
                //Browser is no longer available
                return e.Message.ToLower().Contains("unable to connect");
            }
            catch (Exception)
            {
                return false;
            }
        });
    }

有时selenium的.Click()会等待自我参考响应。要超越它,并让测试继续进行,我将使用您的代码执行以下操作。

    driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));

    try{ selenium.click(Link); }
    catch(WebDriverException) {}
    WaitForPageToLoad(driver); 
    //look for your element.

将其与隐式等待相结合,一旦JavaScript报告该页面已完成加载,您就可以查找您的元素。我发现它比在60秒内找不到元素的硒更具动态性。

答案 2 :(得分:0)

解决方案取决于您正在测试的应用程序的性质。如果单击操作,则加载新页面,然后您可以使用selenium的waitForPageToLoad命令,如下所示:

selenium.click(Link);
selenium.waitForPageToLoad(60000);

注意:该参数是超时值,以毫秒为单位。因此,这将等待最多60秒的页面加载。

点击和等待功能的最佳解决方法可能就是使用Selenium的waitForCondition方法:

selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000);

Selenium持续运行isElementPresent方法,直到它返回true或达到作为第二个参数给出的超时值。此外,selenium.waitForCondition可以运行selenium.isTextPresent以检查屏幕上是否显示文字,然后继续使用该脚本。