在InternetExplorerDriver中提取资源条目

时间:2016-07-07 15:27:52

标签: c# internet-explorer selenium selenium-iedriver

我正在使用Selenium Webdriver并正在使用IE11。我想从HTML页面访问窗口性能资源。
从chrome我可以轻松地使用

IJavaScriptExecutor js = _webDriver as IJavaScriptExecutor;
ReadOnlyCollection<object> rList =  ReadOnlyCollection<object>)js.ExecuteScript("return window.performance.getEntriesByType(\"resource\")");

然后一个简单的String对象字典转换让我得到详细信息。

但相同的代码不适用于IE。在那里,我被迫将js返回的内容转换为ReadOnlyCollection<IWebElement> - 这显然不包含我想要的任何信息。
有谁知道我应该做些什么来获得真实信息回来?

2 个答案:

答案 0 :(得分:0)

我找到了各种答案 基本上我可以查询这样的字符串来查找数组描述和访问单个项目。

"return window.performance.getEntriesByType(\"resource\").length"
"return window.performance.getEntriesByType(\"resource\")[0].name"

不是我预期的解决方案,但它有效

答案 1 :(得分:0)

编辑:我会因为我多么愚蠢而离开我的另一个答案。 这就是我现在使用的内容。

        var resourceJson = ieDriver.ExecuteScript("var resourceTimings = window.performance.getEntriesByType(\"resource\");return JSON.stringify(resourceTimings)");
        var resourceTimings = JsonConvert.DeserializeObject<System.Collections.ObjectModel.ReadOnlyCollection<object>>(resourceJson.ToString());

我被困在同一条船上,这是我能做的最好的事情:

        var resNames = ieDriver.ExecuteScript("var keys = [];for(var key in window.performance.getEntriesByType(\"resource\")){keys.push(key);} return keys;");
        Dictionary<string, Dictionary<string, object>> resTimings = new Dictionary<string, Dictionary<string, object>>();
        foreach (string name in (System.Collections.ObjectModel.ReadOnlyCollection<object>)resNames)
        {
            var resource = new Dictionary<string, object>();
            var resProperties = ieDriver.ExecuteScript(string.Format("var keys = [];for(var key in window.performance.getEntriesByType(\"resource\")[{0}]){{keys.push(key);}} return keys;", name));
            foreach (string property in (System.Collections.ObjectModel.ReadOnlyCollection<object>)resProperties)
            {
                resource.Add(property, ieDriver.ExecuteScript(string.Format("return window.performance.getEntriesByType(\"resource\")[{0}].{1};", name, property)));
            }
            resTimings.Add(name, resource);
        }

这有效,但似乎需要太长时间。我确定要做很多优化。不太了解js,但似乎可以更快地卸载那里的工作。