【问题标题】:Unable to wait in page when partial page is getting loaded due to Ajax由于 Ajax 加载部分页面时无法在页面中等待
【发布时间】:2016-12-22 14:36:34
【问题描述】:

我在 html 的部分标记中有一些控件,当ajax 请求完成时这些控件会加载。现在有一种情况,ajax 已加载但控件未出现在页面上,我想停止代码执行,直到所有控件都加载并在页面上可见。

如何识别页面上是否加载了所有控件。

我不想使用以下解决方案:

1) 代码中的显式等待(因为我不知道何时加载控件)。

2)我不想使用wait.Until(ExpectedConditions.ElementIsVisible(By.Id(id)));(因为如果页面上不存在特定控件,那么它将无限期地等待)

任何帮助将不胜感激。

【问题讨论】:

  • 我使用了 document.readystate,但它即将“完成”,但由于 ajax 请求未完成,控件未加载到页面上。
  • 使用Google 获取更多关于ExplicitWait 是什么以及ExpectedConditions + WebdriverWait 工作原理的信息...同时提供更多信息,例如HTML,您使用的编程语言(添加适当的标签),一段你的代码
  • 你的代码在哪里,你试过什么?

标签: selenium selenium-webdriver selenium-firefoxdriver


【解决方案1】:
  1. 创建一个名为 ExtensionMethods 的类
  2. 在这个类中添加以下方法

    public static void WaitForPageToLoad(这个 IWebDriver 驱动) { TimeSpan 超时 = new TimeSpan(0, 0, 30); WebDriverWait 等待 = new WebDriverWait(驱动程序, 超时);

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

    }

此代码将等待所有 JavaScript 加载完毕。

  1. 在与页面上的元素交互之前使用此方法

【讨论】:

  • 这段代码只等到所有静态资源从服务器加载完毕(由url/html发起,而不是JS),而不是等到所有JS完成后台请求。
  • @skandigraun 你错了,你应该考虑删除反对票。
  • specification 只讨论资源,而不是触发load 事件后的额外请求。This 问题可能也有用。建议的解决方案实际上只是一个“忙睡眠”,在页面加载之前,selenium 不会返回也不允许与页面交互。Jquery 有一个简单的功能来计算/检查 ajax 请求,或者覆盖 XMLHttpRequest.readyState 事件也可能是一个解决方案。
猜你喜欢
  • 2018-08-13
  • 2012-09-30
  • 2010-09-08
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2017-09-13
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多