【问题标题】:Selenium.click Timed out waiting for action to finishSelenium.click 等待操作完成超时
【发布时间】:2012-05-07 17:51:51
【问题描述】:

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

【问题讨论】:

  • 你永远不会去for声明。应该是for (int i = 0; i &lt; 60 ; i++)
  • 我刚刚注意到了。错字在问题中,但不是实际代码,所以我在这里修复了它。但同样的问题仍然存在。

标签: selenium webdriver selenium-rc


【解决方案1】:

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

【讨论】:

  • 实际上用 try/catch 包围它效果很好。我仍然可以捕捉到错误,但它不会通过我的测试,因此我可以使用其他方法来确认已加载的页面。感谢您的建议。
【解决方案2】:

我建议您将此方法/函数合并到您的代码中。

    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 秒内找不到元素的机会硒更具动态性。

【讨论】:

    【解决方案3】:

    解决方案取决于您正在测试的应用程序的性质。如果点击动作,加载一个新页面,那么你可以使用 selenium 的 waitForPageToLoad 命令如下:

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

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

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

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

    Selenium 连续运行 isElementPresent 方法,直到它返回 true 或达到作为第二个参数给出的超时值。此外,selenium.waitForCondition 可以运行 selenium.isTextPresent 来检查屏幕上是否存在文本,然后再继续执行脚本。

    【讨论】:

    • 实际上我在这里遇到的问题是我的测试从未通过 selenium.click 命令,甚至无法到达 selenium.waitForPageToLoad 或 selenium.waitForCondition。 selenium.click 似乎有一个内置的等待,我似乎无法使用任何其他方法来验证页面是否已加载。
    • 我 2019 年来到这里,遇到这个问题,您找到解决方法了吗?
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多