javascript - C# Cefsharp 无法 getElementsByClassName

标签 javascript c# automation chromium cefsharp

我正在尝试按 cefsharp 中的类名从元素中读取文本。 @Jim W 的这段代码执行类似的任务,只是它使用 ID 而不是类

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 并提供类名以及索引,我收到错误:“Uncaught SyntaxError:missing ) after argument list @:1:53” 作为返回结果。我找不到丢失的 ) 的位置,并且我在很多地方尝试了 () 的许多不同位置,但我不认为这才是真正的错误。我尝试过的所有操作仍然给我错误@:1:53(位置?),我认为这意味着它在尝试查找类名之前出错。有谁知道我如何成功地使 cefsharp 返回按类名找到的内容的文本值?

编辑:在运行我在此处引用的代码的副本和粘贴选择后,我实际上遇到了不同的问题,现在它只返回 null。 (这实际上应该是相同的代码)

这是返回 null 的代码

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是一个类似DIVSPAN的元素,你可以使用

var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('mw-headline')[0].innerText; })();", null);

这是有效的,因为value用于文本框和输入字段,而像DIV这样的静态标记元素具有innerText和innerHTML。

关于javascript - C# Cefsharp 无法 getElementsByClassName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863951/

相关文章:

javascript - Node.js 在哪里存储缓冲区?

javascript - 从组 paperJS 中删除特定的子组

javascript - 有没有办法减少与其调用者通信的无限生成器中的产量数量?

c# - 使用 iTextSharp 打开另存为窗口

python - 哪种用于 Windows GUI 自动化的 Python 扩展能够最灵活地处理设计不良的 UI?

javascript - 在 JavaScript 中使对象在 Canvas 上移动

c# - 如何将两个字符串组合成另一个字符串的名称并调用该字符串?

c# - 从 global.asax vs quartz.net 运行定时器

python - 如何在 iOS Appium 上按 "OK"弹出位置

javascript - 复制/b 除两个之外的所有类型的文件