如何使用 CEFSharp 访问元素?

SJ1*_*J10 4 c# chromium-embedded cefsharp

我第一次使用 CEFSharp C#,我很难弄清楚如何让浏览器做除了 browser.Load(""); 之外的任何事情。我已经在许多网站上搜索了几个小时,但似乎没有人有答案或有这个问题。我试图访问网站元素,就好像它们是 c# 表单控件一样......简而言之。我不应该问广泛的问题......我该怎么做browser.Click("/*elementName*/")?另外,有没有办法做类似的事情browser.TextBox1.Text = "blah";

@吉姆W

我的代码到目前为止:更新 6/6/2018 4:29 pm

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace WebAppWorkAround
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeChromium();
        }
        List<string> classList = new List<string>();
        public ChromiumWebBrowser chromeBrowser;

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);
            chromeBrowser = new ChromiumWebBrowser("https://en.wikipedia.org/wiki/Main_Page");
            this.panel1.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }
        public string extract;

        private void button1_Click(object sender, EventArgs e)
        {

            string EvaluateJavaScriptResult;
            var frame = chromeBrowser.GetMainFrame();
            var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('aaa').value; })();", null);

            task.ContinueWith(t =>
            {
                if (!t.IsFaulted)
                {
                    var response = t.Result;
                    EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());





        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

错误 CS1061“Task”不包含“Result”的定义,并且找不到接受“Task”类型的第一个参数的扩展方法“Result”(您是否缺少 using 指令或程序集引用?)(第 61 行)

错误 CS0266 无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?)(第 62 行)

Jim*_*ica 6

看起来不像打电话那么简单

browser.TextBox1.Text = "blah"; 
Run Code Online (Sandbox Code Playgroud)

据我了解,CEFSharp 是一种从 C# 包装器执行 Javascript 的方法。它不是 DOM 的 C# 版本(这是它所需要的)。

所以,从 Github wiki 我会说你需要使用这个代码

string EvaluateJavaScriptResult;
var frame = chromeBrowser.GetMainFrame();
var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('<textBoxElementID>').value; })();", null);

task.ContinueWith(t =>
{
    if (!t.IsFaulted)
    {
        var response = t.Result;
        EvaluateJavaScriptResult = response.Success ? (response.Result.ToString() ?? "null") : response.Message;
    }
}, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)

然后EvaluateJavaScriptResult应该在文本框中输入文本。

这是一个完整的工作示例,设计器只需要一个面板(panel1)和一个按钮(button1):

运行它,在搜索框中输入一些内容(在维基百科中),然后点击按钮,你应该看到一个带有搜索框内容的消息框

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeChromium();
        }
        List<string> classList = new List<string>();
        public ChromiumWebBrowser chromeBrowser;

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);
            chromeBrowser = new ChromiumWebBrowser("https://en.wikipedia.org/wiki/Main_Page");
            this.panel1.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }
        public string extract;

        private void button1_Click(object sender, EventArgs e)
        {

            string EvaluateJavaScriptResult;
            var frame = chromeBrowser.GetMainFrame();
            var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('searchInput').value; })();", null);

            task.ContinueWith(t =>
            {
                if (!t.IsFaulted)
                {
                    var response = t.Result;
                    EvaluateJavaScriptResult = response.Success ? (response.Result.ToString() ?? "null") : response.Message;
                    MessageBox.Show(EvaluateJavaScriptResult);
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());





        }


    }
}
Run Code Online (Sandbox Code Playgroud)