C# Cefsharp 无法获取 ElementsByClassName
C# Cefsharp unable to getElementsByClassName
我正在尝试通过 cefsharp 中的 class 名称从元素中读取文本。来自@Jim W 的代码执行类似的任务,只是它使用 ID 而不是 class
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());
}
将 string EvaluateJavaScriptResult;
更改为 obj EvaluateJavaScriptResult;
并将 document.getElementById
更改为 document.getElementsByClassName
并提供 class 名称和索引后,我收到错误消息:"Uncaught SyntaxError: missing ) after argument list @:1:53"
作为 return 结果。我找不到丢失的 )
在哪里,我在很多地方尝试了很多不同的 (
和 )
位置,我认为这不再是真正的错误。我尝试过的所有方法仍然给我错误@:1:53(位置?),我认为这意味着它在尝试查找 class 名称之前出错。有谁知道我如何成功地使 cefsharp return 成为 classname 找到的东西的文本值?
编辑:在 运行 复制并粘贴我在这里引用的代码后,我实际上遇到了一个不同的问题,现在它只是 return 为空。 (这真的应该只是相同的代码)
这是return空
的代码
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)
{
object EvaluateJavaScriptResult;
var frame = chromeBrowser.GetMainFrame();
var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('mw-headline')[0].value; })();", null);
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
MessageBox.Show(EvaluateJavaScriptResult.ToString());
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
}
什么元素是mw-headline
,那个有.value
属性吗?可能不会,考虑到正在发生的事情。
假设mw-headline
是像DIV
或SPAN
这样的元素,你可以使用
var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('mw-headline')[0].innerText; })();", null);
这是有效的,因为 value
用于文本框和输入字段,而 DIV
等静态标记元素具有 innerText 和 innerHTML。
我正在尝试通过 cefsharp 中的 class 名称从元素中读取文本。来自@Jim W 的代码执行类似的任务,只是它使用 ID 而不是 class
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());
}
将 string EvaluateJavaScriptResult;
更改为 obj EvaluateJavaScriptResult;
并将 document.getElementById
更改为 document.getElementsByClassName
并提供 class 名称和索引后,我收到错误消息:"Uncaught SyntaxError: missing ) after argument list @:1:53"
作为 return 结果。我找不到丢失的 )
在哪里,我在很多地方尝试了很多不同的 (
和 )
位置,我认为这不再是真正的错误。我尝试过的所有方法仍然给我错误@:1:53(位置?),我认为这意味着它在尝试查找 class 名称之前出错。有谁知道我如何成功地使 cefsharp return 成为 classname 找到的东西的文本值?
编辑:在 运行 复制并粘贴我在这里引用的代码后,我实际上遇到了一个不同的问题,现在它只是 return 为空。 (这真的应该只是相同的代码)
这是return空
的代码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)
{
object EvaluateJavaScriptResult;
var frame = chromeBrowser.GetMainFrame();
var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('mw-headline')[0].value; })();", null);
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
MessageBox.Show(EvaluateJavaScriptResult.ToString());
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
}
什么元素是mw-headline
,那个有.value
属性吗?可能不会,考虑到正在发生的事情。
假设mw-headline
是像DIV
或SPAN
这样的元素,你可以使用
var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('mw-headline')[0].innerText; })();", null);
这是有效的,因为 value
用于文本框和输入字段,而 DIV
等静态标记元素具有 innerText 和 innerHTML。