0

我在 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 循环。

4

3 回答 3

1

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

于 2012-05-07T22:08:32.380 回答
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 秒内找不到元素的机会硒更有活力。

于 2014-01-16T23:38:35.997 回答
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

于 2012-05-08T02:36:12.063 回答