CefSharp - 获取 HTML 元素的值

10

如何使用CefSharp获取HTML元素的值?

我知道如何使用默认的WebBrowser控件来实现:

Dim Elem As HtmlElement = WebBrowser1.Document.GetElementByID("id")

但是我没有找到与CefSharp类似的东西。我使用CefSharp的主要原因是网站的一部分使用iframes来存储源代码,而默认的WebBrowser不支持它。另外,CefSharp是否有调用InvokeMember或类似调用的选项?

顺便说一下,我正在使用最新版本的CefSharp。


如果我没记错的话,你需要将文档转换为MSHTML.IHTMLDocument2。 - JWP
阅读 CefSharp FAQ 以了解基础知识。请记住,它不是内置控件的一对一替代品。 - amaitland
你尝试过这样写吗:HtmlElement Elem = webBrowser1.Document.GetElementById("id"); - sujith karivelil
5个回答

14

在他们的常见问题解答中有一个非常好的示例,展示了如何做到这一点。

https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#2-how-do-you-call-a-javascript-method-that-return-a-result

以下是代码,相当明显易懂,对我很有效。

string script = string.Format("document.getElementById('startMonth').value;");
browser.EvaluateScriptAsync(script).ContinueWith(x =>
        {
            var response = x.Result;

            if (response.Success && response.Result != null)
            {
            var startDate = response.Result;
            //startDate is the value of a HTML element.
        }      
    });

你测试过这个吗? - Nulle
我还没有成功地使用 browser.EvaluateScriptAsync(script) 方法,但是我已经成功使用了 browser.GetMainFrame.ExecuteJavascriptAsync(script) 方法。 - Nulle
1
等待 _browser.GetMainFrame().EvaluateScriptAsync(script).ContinueWith(x =>,然后执行以下操作: var response = x.Result; if (response.Success) { //do ur stuff }此代码对我有效,否则请参考官方文档: doc - ElRaph
1
我认为这很令人困惑,因为属性的完整名称是 x.Result.Result。 - JBrooks

3

这是唯一对我有效的方法,版本为 57.0.0.0。

((CefSharp.Wpf.ChromiumWebBrowser)chromeBrowser).FrameLoadEnd += Browser_FrameLoadEnd;

....

async void Browser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
    {            
        Console.WriteLine("cef-"+e.Url);

        if (e.Frame.IsMain)
        {                 
            string HTML = await e.Frame.GetSourceAsync();               
            Console.WriteLine(HTML);
        }
    }

2

这对我有用。你可以自己修改它。

private async void TEST()
{
    string script = "document.getElementsByClassName('glass')[0]['firstElementChild']['firstChild']['wholeText']";
    JavascriptResponse response = await browser.EvaluateScriptAsync(script);
    label1.Text = response.Result.ToString();
}

也许这个能完成你的任务。

private async void TEST()
{
    string script = "Document.GetElementByID('id').value";
    JavascriptResponse response = await browser.EvaluateScriptAsync(script);
    string resultS = response.Result.ToString(); // whatever you need
}

0

使用CefSharp,您可以通过JavaScript获取元素的值。

例如:

m_browser.ExecuteScriptAsync("document.GetElementById('id1');");

关于 JavaScript,你可以从 w3s 学习。
我认为你应该阅读 this passage
祝玩得愉快。

8
这不会返回任何值。 - Andreas Furster

0
string script = @"document.getElementById('id_element').style;";
browser.EvaluateScriptAsync(script).ContinueWith(x=> {
    var response = x.Result;
    if (response.Success && response.Result != null)
    {
        System.Dynamic.ExpandoObject abc = (System.Dynamic.ExpandoObject)response.Result;
        foreach (KeyValuePair<string,object> item in abc)
        {
            string key = item.Key.ToString();
            string value = item.Value.ToString();
        }
    }
});

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接