欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)系統(tǒng)休眠或靜止休眠的方法

    C#實(shí)現(xiàn)系統(tǒng)休眠或靜止休眠的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)系統(tǒng)休眠或靜止休眠的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 如何使用C#代碼創(chuàng)建快捷方式文件詳解

    如何使用C#代碼創(chuàng)建快捷方式文件詳解

    在Windows中創(chuàng)建快捷方式很簡單,如果想用C#代碼的方式創(chuàng)建,就沒有那么方便了,因?yàn)?NET框架沒有提供直接創(chuàng)建快捷方式的方法。這篇文章主要給大家介紹了關(guān)于如何使用C#代碼創(chuàng)建快捷方式文件的相關(guān)資料,需要的朋友可以參考下
    2018-08-08
  • C#使用MailAddress類發(fā)送html格式郵件的實(shí)例代碼

    C#使用MailAddress類發(fā)送html格式郵件的實(shí)例代碼

    這篇文章主要介紹如何使用C#的MailAddress類發(fā)送郵件的方法,大家參考使用吧
    2013-11-11
  • C# 添加、修改和刪除PDF書簽的實(shí)例代碼

    C# 添加、修改和刪除PDF書簽的實(shí)例代碼

    本篇文章主要介紹了C# 添加、修改和刪除PDF書簽的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 淺談C#中ListView類的用法

    淺談C#中ListView類的用法

    這篇文章主要介紹了淺談C#中ListView的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#結(jié)合OpenCVSharp4使用直方圖算法實(shí)現(xiàn)圖片相似度比較

    C#結(jié)合OpenCVSharp4使用直方圖算法實(shí)現(xiàn)圖片相似度比較

    這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4使用直方圖算法實(shí)現(xiàn)圖片相似度比較,文中的示例代碼簡潔易懂,需要的小伙伴可以參考下
    2023-09-09
  • c#.net 常用函數(shù)和方法集

    c#.net 常用函數(shù)和方法集

    c#.net 常用函數(shù)和方法集 ,學(xué)習(xí)的朋友可以參考下。
    2009-07-07
  • unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體

    unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • c# 實(shí)現(xiàn)圖片查看器

    c# 實(shí)現(xiàn)圖片查看器

    這篇文章主要介紹了c# 如何實(shí)現(xiàn)圖片查看器,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#遍歷List并刪除某個(gè)元素的方法

    C#遍歷List并刪除某個(gè)元素的方法

    這篇文章主要介紹了C#遍歷List并刪除某個(gè)元素的方法,實(shí)例分析了正序與倒序遍歷list及刪除元素的使用技巧,需要的朋友可以參考下
    2015-02-02

最新評(píng)論