当前位置: 代码网 > it编程>编程语言>C# > C#使用CefSharp和网页进行自动化交互的示例代码

C#使用CefSharp和网页进行自动化交互的示例代码

2024年09月08日 C# 我要评论
这里以winfroms为例1.先安装对应的包,我目前用的最新版本。cefsharp.winforms版本126.2.70.02.nuget安装完成后,直接使用2.1、初始化 public

这里以winfroms为例

1.先安装对应的包,我目前用的最新版本。

cefsharp.winforms 版本126.2.70.0

2.nuget安装完成后,直接使用

2.1、初始化

        public cefsharp.winforms.chromiumwebbrowser chromebrowser;
        public void initializechromium()
        {
            cefsettings settings = new cefsettings();
            settings.locale = "zh-cn";
            cef.initialize(settings);
            chromebrowser = new chromiumwebbrowser("https://www.sporttery.cn/jc/jsq/zqspf/");
            chromebrowser.javascriptobjectrepository.settings.legacybindingenabled = true;
            //cefsharpsettings.wcfenabled = true;
            // 添加你的c#类为可由javascript调用
            chromebrowser.javascriptobjectrepository.register("bridge", new jstocsharpbridge(), false, bindingoptions.defaultbinder);

            // 添加事件处理器以监听页面加载结束
            chromebrowser.frameloadend += onbrowserframeloadend;
            //添加控件
            this.controls.add(chromebrowser);
            this.chromebrowser.dock = dockstyle.fill;
            chromebrowser.keyboardhandler = new cefkeyboardhander();

        }

2.2、如果你需要在网页加载好后,就注入js事件,可以写在onbrowserframeloadend

 private  void onbrowserframeloadend(object sender, frameloadendeventargs e)
 {
     if (e.frame.ismain)
     {
         // 注入javascript以添加点击事件
         string script = @"
             (function() {
                 var btn = document.queryselector('#detailbtn');
                 if (btn) {
                     btn.addeventlistener('click', function() {
                      settimeout(function() {
                                  var result1 = document.queryselector('#viewdetailtbl > tr:nth-child(1) > td:nth-child(2)').textcontent
                                  console.log(111); 
                                  console.log(result1); 

                                  bridge.callcsharpfunction(result1);



                             }, 500); // 等待1秒
                        

                     });
                 }
             })();
         "; 
         e.frame.executejavascriptasync(script);


     }
 }

这里意思是页面加载完成后,给页面中的按钮注入一个点击事件。其中executejavascriptasync用于注入js,这个是没有返回值的。

2.3、接下来我们看看如何注入js到网页中,并且带返回值。

        private async void button1_click(object sender, eventargs e)
        {

            var js = @"
                    (() => {
                 
                      var week1 = document.queryselector('#list_1025933 > td:nth-child(1)').textcontent
                      var lname1 = document.queryselector('#list_1025933 > td.lname > a').text
                      var vstd1 = document.queryselector('#list_1025933 > td.vstd').textcontent
                      var win1 = document.queryselector('#list_1025933 > td:nth-child(6) > div.hadodds.bline > span:nth-child(1)').textcontent
                      var week2 = document.queryselector('#list_1025934 > td:nth-child(1)').textcontent
                      var lname2 = document.queryselector('#list_1025934 > td.lname > a').text
                      var vstd2 = document.queryselector('#list_1025934 > td.vstd').textcontent
                      var flat = document.queryselector('#list_1025934 > td:nth-child(6) > div.hadodds.bline > span:nth-child(2)').textcontent
                        var times = document.queryselector('#times').value;
                        var consume = document.queryselector('#consume').textcontent;
                        var bonus = document.queryselector('#bonus').textcontent;
                        return {week1,lname1,vstd1,win1,week2,lname2,vstd2,flat,times, consume, bonus };
                    })();
                ";

            dynamic result = await chromebrowser.evaluatescriptasync(js);

            // 访问返回的json对象的属性

           // string result1 = result.result.result1;
            string times = result.result.times;
            string consume = result.result.consume;
            string bonus = result.result.bonus;

            // 使用返回的数据
            messagebox.show($"{result.result.week1}{result.result.lname1}{result.result.vstd1} 胜{result.result.win1}\n{result.result.week2}{result.result.lname2}{result.result.vstd2} 平{result.result.flat}\n{result1}  \n倍率: {times} 投注: {consume} 理论最高奖金: {bonus}");
        }

这里就是点击winfrom中的按钮,然后注入js,js执行后把js的结果返回给c#。

2.4、接着我们看看如何通过js调用c#中的函数

        public class jstocsharpbridge
        {
            public void callcsharpfunction(string message)
            {

                // 在这里调用你自己的c#函数
                result1 = message;
            }
        }
        static string result1 = string.empty;

首先我们要定义js调用的方法,这里单独写一个类,然后需要在初始化的时候注入这个类

 chromebrowser.javascriptobjectrepository.settings.legacybindingenabled = true;
            //cefsharpsettings.wcfenabled = true;
            // 添加你的c#类为可由javascript调用
            chromebrowser.javascriptobjectrepository.register("bridge", new jstocsharpbridge(), false, bindingoptions.defaultbinder);

只有注入了,才能被js代码识别,然后调用。
bridge.callcsharpfunction(result1);这个就是调用方式。这句话在页面加载后,注入点击事件中有写到。

2.5、开启调试模式

        public class cefkeyboardhander : ikeyboardhandler
        {
            public bool onkeyevent(iwebbrowser browsercontrol, ibrowser browser, keytype type, int windowskeycode, int nativekeycode, cefeventflags modifiers, bool issystemkey)
            {
                if (type == keytype.keyup && enum.isdefined(typeof(keys), windowskeycode))
                {
                    var key = (keys)windowskeycode;
                    switch (key)
                    {
                        case keys.f12:
                            browser.showdevtools();
                            break;

                        case keys.f5:

                            if (modifiers == cefeventflags.controldown)
                            {
                                //messagebox.show("ctrl+f5");
                                browser.reload(true); //强制忽略缓存

                            }
                            else
                            {
                                //messagebox.show("f5");
                                browser.reload();
                            }
                            break;


                    }
                }
                return false;
            }

            public bool onprekeyevent(iwebbrowser browsercontrol, ibrowser browser, keytype type, int windowskeycode, int nativekeycode, cefeventflags modifiers, bool issystemkey, ref bool iskeyboardshortcut)
            {
                return false;
            }
        }

初始化的时候添加:
chromebrowser.keyboardhandler = new cefkeyboardhander();这样就可以在winfrom中按f12进行调试

记得关闭窗体的时候,关掉cef引擎

       private void form1_formclosing(object sender, formclosingeventargs e)
       {
           cef.shutdown();
          //chromebrowser.closedevtools();
       }

接着给出所有代码:

using cefsharp.winforms;
using system;
using system.windows.forms;

namespace cefsharp.demo
{
    


    public partial class form1 : form
    {
        public class jstocsharpbridge
        {
            public void callcsharpfunction(string message)
            {

                // 在这里调用你自己的c#函数
                result1 = message;
            }
        }
        static string result1 = string.empty;
        public form1()
        {
            initializecomponent();
            initializechromium();
        }

        private void form1_load(object sender, eventargs e)
        {
  

        }

        public cefsharp.winforms.chromiumwebbrowser chromebrowser;
        public void initializechromium()
        {
            cefsettings settings = new cefsettings();
            settings.locale = "zh-cn";
            cef.initialize(settings);
            chromebrowser = new chromiumwebbrowser("https://www.sporttery.cn/jc/jsq/zqspf/");
            chromebrowser.javascriptobjectrepository.settings.legacybindingenabled = true;
            //cefsharpsettings.wcfenabled = true;
            // 添加你的c#类为可由javascript调用
            chromebrowser.javascriptobjectrepository.register("bridge", new jstocsharpbridge(), false, bindingoptions.defaultbinder);

            // 添加事件处理器以监听页面加载结束
            chromebrowser.frameloadend += onbrowserframeloadend;
            //添加控件
            this.controls.add(chromebrowser);
            this.chromebrowser.dock = dockstyle.fill;
            chromebrowser.keyboardhandler = new cefkeyboardhander();

        }

        private  void onbrowserframeloadend(object sender, frameloadendeventargs e)
        {
            if (e.frame.ismain)
            {
                // 注入javascript以添加点击事件
                string script = @"
                    (function() {
                        var btn = document.queryselector('#detailbtn');
                        if (btn) {
                            btn.addeventlistener('click', function() {
                             settimeout(function() {
                                         var result1 = document.queryselector('#viewdetailtbl > tr:nth-child(1) > td:nth-child(2)').textcontent
                                         console.log(111); 
                                         console.log(result1); 

                                         bridge.callcsharpfunction(result1);



                                    }, 500); // 等待1秒
                               

                            });
                        }
                    })();
                "; 
                e.frame.executejavascriptasync(script);


            }
        }

        private void form1_formclosing(object sender, formclosingeventargs e)
        {
            cef.shutdown();
           //chromebrowser.closedevtools();
        }

        public class cefkeyboardhander : ikeyboardhandler
        {
            public bool onkeyevent(iwebbrowser browsercontrol, ibrowser browser, keytype type, int windowskeycode, int nativekeycode, cefeventflags modifiers, bool issystemkey)
            {
                if (type == keytype.keyup && enum.isdefined(typeof(keys), windowskeycode))
                {
                    var key = (keys)windowskeycode;
                    switch (key)
                    {
                        case keys.f12:
                            browser.showdevtools();
                            break;

                        case keys.f5:

                            if (modifiers == cefeventflags.controldown)
                            {
                                //messagebox.show("ctrl+f5");
                                browser.reload(true); //强制忽略缓存

                            }
                            else
                            {
                                //messagebox.show("f5");
                                browser.reload();
                            }
                            break;


                    }
                }
                return false;
            }

            public bool onprekeyevent(iwebbrowser browsercontrol, ibrowser browser, keytype type, int windowskeycode, int nativekeycode, cefeventflags modifiers, bool issystemkey, ref bool iskeyboardshortcut)
            {
                return false;
            }
        }

        private async void button1_click(object sender, eventargs e)
        {

            var js = @"
                    (() => {
                 
                      var week1 = document.queryselector('#list_1025933 > td:nth-child(1)').textcontent
                      var lname1 = document.queryselector('#list_1025933 > td.lname > a').text
                      var vstd1 = document.queryselector('#list_1025933 > td.vstd').textcontent
                      var win1 = document.queryselector('#list_1025933 > td:nth-child(6) > div.hadodds.bline > span:nth-child(1)').textcontent
                      var week2 = document.queryselector('#list_1025934 > td:nth-child(1)').textcontent
                      var lname2 = document.queryselector('#list_1025934 > td.lname > a').text
                      var vstd2 = document.queryselector('#list_1025934 > td.vstd').textcontent
                      var flat = document.queryselector('#list_1025934 > td:nth-child(6) > div.hadodds.bline > span:nth-child(2)').textcontent
                        var times = document.queryselector('#times').value;
                        var consume = document.queryselector('#consume').textcontent;
                        var bonus = document.queryselector('#bonus').textcontent;
                        return {week1,lname1,vstd1,win1,week2,lname2,vstd2,flat,times, consume, bonus };
                    })();
                ";

            dynamic result = await chromebrowser.evaluatescriptasync(js);

            // 访问返回的json对象的属性

           // string result1 = result.result.result1;
            string times = result.result.times;
            string consume = result.result.consume;
            string bonus = result.result.bonus;

            // 使用返回的数据
            messagebox.show($"{result.result.week1}{result.result.lname1}{result.result.vstd1} 胜{result.result.win1}\n{result.result.week2}{result.result.lname2}{result.result.vstd2} 平{result.result.flat}\n{result1}  \n倍率: {times} 投注: {consume} 理论最高奖金: {bonus}");
        }
    }
}

到此这篇关于c#使用cefsharp和网页进行自动化交互的示例代码的文章就介绍到这了,更多相关c# cefsharp和网页自动化交互内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com