如何使用 CEFSharp 访问元素?
How to access elements with CEFSharp?
我是第一次使用 CEFSharp C#,我很难弄清楚如何让浏览器做任何事情,但 browser.Load("");
我已经在许多网站上搜索了几个小时,但似乎没有人有答案或有这个问题。我正在尝试访问网站元素,就好像它们是 C# 表单控件一样……简而言之。我不应该问宽泛的问题...我该怎么做 browser.Click("/*elementName*/")
这样的事情?另外,有没有办法做类似browser.TextBox1.Text = "blah";
的事情?
@Jim W
到目前为止我的代码:2018 年 6 月 6 日更新 4:29 下午
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());
}
}
}
错误:
错误 CS1061 'Task' 不包含 'Result' 的定义,并且找不到接受类型 'Task' 的第一个参数的扩展方法 'Result'(您是否缺少using 指令还是程序集引用?)(第 61 行)
错误 CS0266 无法将类型 'object' 隐式转换为 'string'。存在显式转换(是否缺少强制转换?)(第 62 行)
看起来不像调用
那么简单
browser.TextBox1.Text = "blah";
据我了解,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());
然后 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());
}
}
}
我是第一次使用 CEFSharp C#,我很难弄清楚如何让浏览器做任何事情,但 browser.Load("");
我已经在许多网站上搜索了几个小时,但似乎没有人有答案或有这个问题。我正在尝试访问网站元素,就好像它们是 C# 表单控件一样……简而言之。我不应该问宽泛的问题...我该怎么做 browser.Click("/*elementName*/")
这样的事情?另外,有没有办法做类似browser.TextBox1.Text = "blah";
的事情?
@Jim W
到目前为止我的代码:2018 年 6 月 6 日更新 4:29 下午
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());
}
}
}
错误:
错误 CS1061 'Task' 不包含 'Result' 的定义,并且找不到接受类型 'Task' 的第一个参数的扩展方法 'Result'(您是否缺少using 指令还是程序集引用?)(第 61 行)
错误 CS0266 无法将类型 'object' 隐式转换为 'string'。存在显式转换(是否缺少强制转换?)(第 62 行)
看起来不像调用
那么简单browser.TextBox1.Text = "blah";
据我了解,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());
然后 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());
}
}
}