CefSharp在NuGet的簡介是“The CefSharp Chromium-based browser component”,機翻的意思就是“基於Cefsharp Chromium的瀏覽器組件”
請注意本文不會有太多功能的詳細介紹,只有實現相關需求的基本功能
請注意本次使用CefSharp版本為57.0.0,最新版本可能相關用法已經不適用
播放視頻需安裝相關Flash軟件才能播放
本次編寫要實現的主要功能是
1:播放視頻,
(本次打開指定網址默認會播放視頻)
2:自動跳轉下一條視頻,
(學習進度100%時跳轉下一個網址)
3:自動點擊驗證
(執行JavaScript代碼)
成品軟件界面如下

一:添加相關引用,NuGet 搜索安裝 CefSharp.WinForms,CefSharp.Common(本次使用版本為57.0.0)

二:項目屬性中平台要進行設置

三:編寫代碼
具體實現方式是,有兩個窗口,一個瀏覽學習列表頁(獲取內頁學習頁面鏈接),另一個瀏覽內頁學習頁面進行學習
CefSharp.WinForms.ChromiumWebBrowser browser = null;
CefSharp.WinForms.ChromiumWebBrowser browserChild = null;
public Form1() { InitializeComponent(); //必須進行初始化,否則出不來頁面啦。 CefSharp.Cef.Initialize(); //實例化控件 即課程列表頁查看和獲取具體學習頁面路徑 browser = new CefSharp.WinForms.ChromiumWebBrowser("http://xxx.xxx.cn"); //設置停靠方式 browser.Dock = DockStyle.Fill; //加入到當前窗體中 this.tabControl1.TabPages[0].Controls.Add(browser); //綁定新窗口打開事件 browser.LifeSpanHandler = new NewWindowCreatedEventHandler(); //browser.LoadHandler = new NewLoadHandler(); //browser.FrameLoadEnd += Browser_FrameLoadEnd; //實例化子控件 即學習頁面 browserChild = new CefSharp.WinForms.ChromiumWebBrowser("about:blank"); //設置停靠方式 browserChild.Dock = DockStyle.Fill; //加入到當前窗體中 this.tabControl1.TabPages[1].Controls.Add(browserChild); Control.CheckForIllegalCrossThreadCalls = false;//防止出現 線程間操作無效: }
/// <summary> /// 打開新窗口事件處理(在當前瀏覽器窗口打開) /// </summary> internal class NewWindowCreatedEventHandler : ILifeSpanHandler { public bool DoClose(IWebBrowser browserControl, IBrowser browser) { return false; } public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser) { } public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser) { } public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { newBrowser = null; var chromiumWebBrowser = (ChromiumWebBrowser)browserControl; chromiumWebBrowser.Load(targetUrl); return true; //Return true to cancel the popup creation copyright by codebye.com. } }
執行JavaScript代碼方法
string BrowserEvaluateScriptAsync(string scriptStr) { StringBuilder sb = new StringBuilder(); sb.AppendLine("function tempFunction() {"); sb.AppendLine(scriptStr); sb.AppendLine("}"); sb.AppendLine("tempFunction();"); string resultStr = ""; try { var task = browser.GetBrowser().GetFrame(browser.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString()); task.ContinueWith(t => { if (!t.IsFaulted) { var response = t.Result; if (response.Success == true) { if (response.Result != null) { resultStr = response.Result.ToString(); } } } }, TaskScheduler.FromCurrentSynchronizationContext()); return resultStr; } catch (Exception ex) { return resultStr; } }
獲取內頁學習頁面鏈接代碼,實現方式是獲取頁面的html然后用正則表達式去匹配當前頁的鏈接
//獲取課程列表 private void GetDataList_Click(object sender, EventArgs e) { Log("獲取課程列表"); if (browser != null) { try { StringBuilder sb = new StringBuilder(); sb.AppendLine("function tempFunction() {"); sb.AppendLine(" return document.body.innerHTML; "); sb.AppendLine("}"); sb.AppendLine("tempFunction();"); var task = browser.GetBrowser().GetFrame(browser.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString()); task.ContinueWith(t => { if (!t.IsFaulted) { var response = t.Result; if (response.Success == true) { if (response.Result != null) { string resultStr = response.Result.ToString(); Regex r = new Regex("(/knowledge/document/[\\S]*.html)|(/knowledge/video/[\\S]*.html)|(/package/video/[\\S]*.html)|(/package/document/[\\S]*.html)|(/knowledge/scorm/[\\S]*.html)|(/package/scorm/[\\S]*.html)|(/package/ebook/[\\S]*.html)");//構造表達式package/scorm MatchCollection matches = r.Matches(resultStr); foreach (Match match in matches) { string word = match.Groups["word"].Value; int index = match.Index; richTextBox1.AppendText(match.Value.Replace("\"", "")); richTextBox1.AppendText("\r\n"); } SetConfig(LastHistroyDataList, richTextBox1.Text); Log("獲取課程列表成功!(添加" + matches.Count.ToString() + "列數據)"); tabControl1.SelectedIndex = 2; } } } }, TaskScheduler.FromCurrentSynchronizationContext()); } catch (Exception ex) { Log("獲取課程列表失敗!(js執行失敗)"); } } else { Log("獲取課程列表失敗!(瀏覽器獲取失敗)"); } }
接下來定時判斷具體學習頁面是否到達100%的進度,如果達到100%的進度,瀏覽下一個鏈接即可
//判斷頁面是否顯示 “已經完成學習” string PanDuanWanCheng() { if (browserChild != null) { try { StringBuilder sb = new StringBuilder(); sb.AppendLine("function tempFunction() {"); sb.AppendLine("return document.getElementById('ScheduleText').innerText;"); sb.AppendLine("}"); sb.AppendLine("tempFunction();"); string resultStr = ""; var task = browserChild.GetBrowser().GetFrame(browserChild.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString()); task.ContinueWith(t => { if (!t.IsFaulted) { var response = t.Result; if (response.Success == true) { if (response.Result != null) { resultStr = response.Result.ToString(); if (resultStr == "100%") { string nowLearnTitle = GetNowLearnTitle(); //Log("課程已完成!" + browserChild.Url.ToString() + "(" + nowLearnTitle + ")"); //完成操作 if (learnWithDataList) { BroserChildStarWithDataList(); } return "1"; } } } } return "0"; }, TaskScheduler.FromCurrentSynchronizationContext()); } catch (Exception ex) { } } return "0"; }
