首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在CefSharp中EvaluateScriptAsync返回空的expando对象

为什么在CefSharp中EvaluateScriptAsync返回空的expando对象
EN

Stack Overflow用户
提问于 2019-08-31 21:09:01
回答 1查看 887关注 0票数 0

我正在尝试使用CefSharp用C#编写一个应用程序。我的意图是获取给定页面上的所有链接,例如,

代码语言:javascript
复制
https://wixlabs---dropbox-folder.appspot.com/index?instance=lp5CbqBbK6JUFzCW2hXENEgT4Jn0Q-U1-lIAgEbjeio.eyJpbnN0YW5jZUlkIjoiYjNiNzk5YjktNjE5MS00ZDM0LTg3ZGQtYjY2MzI1NWEwMDNhIiwiYXBwRGVmSWQiOiIxNDkyNDg2NC01NmQ1LWI5NGItMDYwZi1jZDU3YmQxNmNjMjYiLCJzaWduRGF0ZSI6IjIwMTgtMDEtMjJUMTg6Mzk6MjkuNjAwWiIsInVpZCI6bnVsbCwidmVuZG9yUHJvZHVjdElkIjpudWxsLCJkZW1vTW9kZSI6ZmFsc2V9&target=_top&width=728&compId=comp-j6bjhny1&viewMode=viewer-seo

当我加载页面并打开dev工具并执行

document.getElementsByTagName('a');

在开发工具中,我得到了374个结果。接下来,我从BrowserLoadingStateChanged执行以下代码:

代码语言:javascript
复制
private async Task ProcessLinksAsync()
        {
            var frame = browser.GetMainFrame();
            var response = await frame.EvaluateScriptAsync("(function() { return document.getElementsByTagName('a'); })();", null);
            ExpandoObject result = response.Result as ExpandoObject;

            Console.WriteLine("Result:" + result);//What do I do here?
        }

我得到了一个似乎不包含任何内容的expando对象。我之所以这样说,是因为我使用了断点并检查了对象。我已经通过了https://keyholesoftware.com/2019/02/11/create-your-own-web-bots-in-net-with-cefsharp/https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration和问题等,但无法解决我的问题。我是不是做错了什么?我的实际意图是获取链接,然后导航到它们。提前谢谢。

编辑:我在浏览器和开发工具中使用了下面的脚本,结果都是正确的,返回187个结果。

代码语言:javascript
复制
(function() { 
    var links=document.getElementsByClassName('file-link'); 
    var linksArray = new Array(); 
    for (var i = 0; i < links.length; i++) { 
        linksArray[i] = String(links[i].href); 
    } 
    return linksArray; 
})(); 

但在我的应用程序中,我得到了一个长度为0的数组。

EDIT-2:我使用以下代码来获取DOM:

代码语言:javascript
复制
public void OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
        {
            ContextCreated?.Invoke(this, frame);
            const string script = "document.addEventListener('DOMContentLoaded', function(){ alert(document.links.length); });";

            frame.ExecuteJavaScriptAsync(script);
        }

对于我尝试的每个其他站点,代码都是成功的,除了上面提到的URL。谁能告诉我什么可能是错误的,因为DOM是加载在开发工具中并完全可访问的。所以,我猜我的代码中可能遗漏了一些东西。再次感谢。

EN

回答 1

Stack Overflow用户

发布于 2019-12-08 12:05:00

您需要等待页面加载。另外,如果页面使用ajax加载数据,则需要等待一段时间才能同时加载数据。然后,您需要将结果整形为一个自定义的javascript对象。

代码语言:javascript
复制
ChromiumWebBrowser browser;
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    browser = new ChromiumWebBrowser(
        "https://google.com/"); // Tried with your URL. 
    browser.LoadingStateChanged += Browser_LoadingStateChanged;
    browser.Dock = DockStyle.Fill;
    Controls.Add(browser);
}

private async void Browser_LoadingStateChanged(object sender,
    LoadingStateChangedEventArgs e)
{
    if (!e.IsLoading)
    {
        await Task.Delay(5000); //Just for pages which use ajax loading data
        var script = @"
        (function () {
            var data = document.getElementsByTagName('a');
            return Array.from(data, a => ({href:a.href, innerText:a.innerText}));
        })();";
        var result = await browser.EvaluateScriptAsync(script);
        var data = (IEnumerable<dynamic>)result.Result;

        MessageBox.Show(string.Join("\n", data.Select(x=>$"{x.href}").Distinct()));
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57738283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档