如何使用 CEFSharp 访问元素?

2023-12-13

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

@Jim 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());





        }
    }
}

errors:

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

错误 CS0266 无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少强制转换?)(第 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());





        }


    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CEFSharp 访问元素? 的相关文章

随机推荐

  • struts2中的作用域拦截器

    有没有示例代码可以让我看到 Struts2 中作用域拦截器的使用 我想将参数从一个操作传递到另一个操作 通过 struts xml 配置 并希望使用范围拦截器 由于我是 Struts 2 的新手 任何人都可以提供使用范围拦截器的示例吗 我相
  • 替换 numpy 数组中的值时防止字符串被截断

    假设我有数组a and b a np array 1 2 3 b np array red red red 如果我要对这些数组应用一些像这样的奇特索引 b a lt 3 blue 我得到的输出是 array blu blu red dtyp
  • LARAVEL - 将我的 laravel 项目放在 000webhost 上

    我已经将 public 文件夹中的文件上传到 public html 将其他文件上传到 laravel 我也改变了index php 但我什么也没得到 我明白了 有人可以帮助我吗 谢谢 编辑 这是我的索引文件 我认为这很好
  • 使用自定义相机创建预览屏幕

    我正在创建一个应用程序 在其中为相机制作了自定义叠加层 我注意到 当我使用相机的正常默认设置时 会出现预览 您可以选择重新拍摄照片或使用它 使用自定义叠加层时是否有一种简单的方法来显示该屏幕 谢谢 是的 为此 您必须以编程方式创建一个相机叠
  • PyInstaller: IOError: [Errno 2] 没有这样的文件或目录:

    我正在尝试使用 pyinstaller 和 science MMTK 等模块来编译 python 脚本 Pyinstaller 无法包含一些 pyd 模块 因此我手动将它们复制到 dist 文件夹中 当我执行编译后的 exe 时 出现以下错
  • WPF TextBox ScrollToLine 如果可见则不更新

    我的程序中有一个导航栏 允许您导航文本框中的不同部分 但我遇到的问题是 如果我滚动到的文本已经在屏幕上可见 则这不起作用 就像在这个例子中一样 如果我尝试从第 1 部分跳转到第 3 部分 它将无法工作 因为它已经可见 但是 在这个例子中 如
  • 文件更改时自动编译

    有没有办法用 typescript 进行自动编译 就像在 CoffeScript 中使用 Mindscape 一样 您只需保存文件 扩展程序就会编译您的代码 VS2012 RTM 使用最新的WebEssentials 2012 扩展 昨天发
  • 如何在 Spring 表达式语言中运行嵌套求值

    我想使用 SPeL 并且需要评估来自配置源的参数 问题是名称 密钥是动态的 所以我依靠一个参数来解析另一个参数 我基本上需要检查布尔参数 例子 部分键 前缀 app name 完整密钥 app name feature isEnabled
  • VS Code - 如何更改资源管理器中灰色文件夹名称的颜色?

    我在用着莫诺凯专业版作为我在 VS Code 中的配色方案 当 VS Code 使在 gitignore文件中 文本颜色变得非常难以阅读 例如 我有 node modules文件夹 红圈 写在我的里面 gitignore文件和 VS Cod
  • 动态规划 - 分词

    我正在尝试解决this问题 问题如下给定一个输入字符串和一个单词字典 找出输入字符串是否可以分割成空格分隔的字典单词序列 字典是一个字符串数组 我的方法是以下递归 fn 并存储递归调用的结果 输出很好 但我发现存储的结果从未被使用 我的解决
  • 通用 iOS 应用程序中的单独设置?

    我正在开发一个通用的 iOS 应用程序 但一些用户设置在 iPad 上没有多大意义 我可以指定单独的 Settings bundle 或 Root plist 在 iPad 上使用吗 从 4 0 开始 您将能够为 ipad 重命名文件 使其
  • Eclipse Mars 不会自动导入 JavaFX

    因此 每次我想使用 JavaFX 8 组件时 我都必须在 google 上搜索包的确切名称 然后手动输入 import packageName 我会说得更详细 假设我想创建一个StackPane StackPane stackPane ne
  • 动态更改 animateCamera 俯仰和缩放属性不起作用

    使用 useState 动态更改 animateCamera 俯仰和缩放属性不起作用 onLayout gt map current animateCamera center latitude location coords latitud
  • 使用分组依据选择前 1 个

    我有两列 namecode name 050125 chris 050125 tof 050125 tof 050130 chris 050131 tof 我想按名称代码分组 并仅返回出现次数最多的名称 在这种情况下 结果将是 050125
  • matplotlib 不支持生成器作为输入

    我正在这个网站上运行笔记本https github com vsmolyakov experiments with python blob master chp01 ensemble methods ipynb用python练习ensemb
  • 将字符串参数从 xhtml 传递给函数或方法

    我有一个按钮 我想根据函数返回 true 还是 false 来呈现它 HTML
  • 在 Windows 和 Mac 上通过 VBA 宏发送带有工作簿的电子邮件

    我的以下代码在 PC 上运行正常 但在 Mac 上不起作用 我希望脚本能够识别当前操作系统并为该操作系统运行适当的命令集 而不是为 Windows 和 Mac 用户制作两个带有单独按钮的宏版本 该宏创建一封带有工作簿附件的电子邮件 该附件是
  • 如何让Linux JVM 64位上出现OutOfMemoryError

    在我的单元测试中 我故意尝试引发 OutOfMemoryError 异常 我使用如下简单的语句 byte block new byte 128 1024 1024 1024 该代码适用于 Win7 64 位和 jdk6u21 64 位 但是
  • 带有加密密码的 Sqlite 连接字符串

    我有一个加密数据库 使用 SQLite 密码 当我尝试使用连接字符串连接到数据库时 出现以下错误消息 SQL 逻辑错误无法使用 密码 连接字符串属性 库未构建加密支持 Imports System Data SQLite Public Cl
  • 如何使用 CEFSharp 访问元素?

    我是第一次使用 CEFSharp C 我很难弄清楚如何让浏览器执行除 browser Load 之外的任何操作 我已经在许多网站上搜索了几个小时 但似乎没有人有答案或有这个问题 我正在尝试访问网站元素 就好像它们是 C 表单控件一样 简而言