最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用CefSharp和網(wǎng)頁進(jìn)行自動(dòng)化交互的示例代碼

 更新時(shí)間:2024年07月03日 10:34:34   作者:愛吃奶酪的松鼠丶  
CefSharp 是一個(gè)用 C# 編寫的開源庫,它封裝了 Google Chrome 瀏覽器的 Chromium 內(nèi)核,CefSharp 允許開發(fā)者在其應(yīng)用程序中嵌入瀏覽器功能,從而能夠展示網(wǎng)頁內(nèi)容、執(zhí)行JavaScript代碼,本文給大家介紹了C#使用CefSharp和網(wǎng)頁進(jìn)行自動(dòng)化交互,需要的朋友可以參考下

這里以winfroms為例

1.先安裝對(duì)應(yīng)的包,我目前用的最新版本。

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調(diào)用
            chromeBrowser.JavascriptObjectRepository.Register("bridge", new JsToCSharpBridge(), false, BindingOptions.DefaultBinder);

            // 添加事件處理器以監(jiān)聽頁面加載結(jié)束
            chromeBrowser.FrameLoadEnd += OnBrowserFrameLoadEnd;
            //添加控件
            this.Controls.Add(chromeBrowser);
            this.chromeBrowser.Dock = DockStyle.Fill;
            chromeBrowser.KeyboardHandler = new CEFKeyBoardHander();

        }

2.2、如果你需要在網(wǎng)頁加載好后,就注入JS事件,可以寫在OnBrowserFrameLoadEnd

 private  void OnBrowserFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
 {
     if (e.Frame.IsMain)
     {
         // 注入JavaScript以添加點(diǎn)擊事件
         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);


     }
 }

這里意思是頁面加載完成后,給頁面中的按鈕注入一個(gè)點(diǎn)擊事件。其中ExecuteJavaScriptAsync用于注入JS,這個(gè)是沒有返回值的。

2.3、接下來我們看看如何注入JS到網(wǎng)頁中,并且?guī)Х祷刂怠?/p>

        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對(duì)象的屬性

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

            // 使用返回的數(shù)據(jù)
            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} 理論最高獎(jiǎng)金: {bonus}");
        }

這里就是點(diǎn)擊winfrom中的按鈕,然后注入JS,JS執(zhí)行后把JS的結(jié)果返回給C#。

2.4、接著我們看看如何通過JS調(diào)用C#中的函數(shù)

        public class JsToCSharpBridge
        {
            public void callCSharpFunction(string message)
            {

                // 在這里調(diào)用你自己的C#函數(shù)
                result1 = message;
            }
        }
        static string result1 = string.Empty;

首先我們要定義JS調(diào)用的方法,這里單獨(dú)寫一個(gè)類,然后需要在初始化的時(shí)候注入這個(gè)類

 chromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
            //CefSharpSettings.WcfEnabled = true;
            // 添加你的C#類為可由JavaScript調(diào)用
            chromeBrowser.JavascriptObjectRepository.Register("bridge", new JsToCSharpBridge(), false, BindingOptions.DefaultBinder);

只有注入了,才能被JS代碼識(shí)別,然后調(diào)用。
bridge.callCSharpFunction(result1);這個(gè)就是調(diào)用方式。這句話在頁面加載后,注入點(diǎn)擊事件中有寫到。

2.5、開啟調(diào)試模式

        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); //強(qiáng)制忽略緩存

                            }
                            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;
            }
        }

初始化的時(shí)候添加:
chromeBrowser.KeyboardHandler = new CEFKeyBoardHander();這樣就可以在winfrom中按F12進(jìn)行調(diào)試

記得關(guān)閉窗體的時(shí)候,關(guān)掉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)
            {

                // 在這里調(diào)用你自己的C#函數(shù)
                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調(diào)用
            chromeBrowser.JavascriptObjectRepository.Register("bridge", new JsToCSharpBridge(), false, BindingOptions.DefaultBinder);

            // 添加事件處理器以監(jiān)聽頁面加載結(jié)束
            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以添加點(diǎn)擊事件
                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); //強(qiáng)制忽略緩存

                            }
                            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對(duì)象的屬性

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

            // 使用返回的數(shù)據(jù)
            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} 理論最高獎(jiǎng)金: {bonus}");
        }
    }
}

到此這篇關(guān)于C#使用CefSharp和網(wǎng)頁進(jìn)行自動(dòng)化交互的示例代碼的文章就介紹到這了,更多相關(guān)C# CefSharp和網(wǎng)頁自動(dòng)化交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

彰化县| 广灵县| 双流县| 白城市| 古田县| 阿巴嘎旗| 永寿县| 亳州市| 乌鲁木齐市| 邓州市| 普格县| 佛学| 申扎县| 东阳市| 思南县| 聂拉木县| 谷城县| 南乐县| 蓬安县| 贵定县| 花莲市| 嵊泗县| 乐亭县| 保德县| 怀来县| 汉沽区| 三江| 吉隆县| 芜湖县| 永吉县| 西青区| 肇庆市| 建宁县| 金平| 墨竹工卡县| 紫阳县| 清远市| 巴林左旗| 博乐市| 泰来县| 镇巴县|