C# 프로그램에 크롬 브라우저 내장하기

필요 패키지
HtmlAgilityPack : HTML 파서
HtmlAgilityPack.CssSelectors : CSS 셀렉터 사용 가능
CsQuery : jQuery 기능 구현

System.Net.Http

CefSharp.WinForms : Chromium-based browser component 


//-------------------------------------------------
CefSharp 사용법
크롬(Chromium ) 사용

//-----------
* 초기화
public ChromiumWebBrowser browser;

        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());            
            browser = new ChromiumWebBrowser("about:blank");
            pictureBox1.Controls.Add(browser);            
            browser.Dock = DockStyle.Fill;
        }

//-----------
* url 이동
browser.Load("www.google.com");

//-----------
* html 소스 읽기
browser.FrameLoadEnd += WebBrowserFrameLoadEnded;
        
        private void WebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
        {
            if (e.Frame.IsMain)
            {
                //browser.ViewSource();//소스를 편집기로 띄움
                browser.GetSourceAsync().ContinueWith(taskHtml =>
                {
                    var html = taskHtml.Result;
                    _log("html", html);
                    selectNode(html, "input[name=q]");
                });
            }
        }

//---------------------
* html 소스 파싱
- HtmlAgilityPack , HtmlAgilityPack.CssSelectors 이용

public HtmlNode selectNode(string sHtml, string sSel)
        {
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(sHtml);

            var document = doc.DocumentNode;
            HtmlNode node = doc.QuerySelector(sSel);
            _log("node", node!=null?node.OuterHtml:"");
            return node;
        }


//---------------------
cefsharp Tutorials
https://github.com/cefsharptutorials/cefsharptutorials/tree/master/CefSharpTutorials
https://www.youtube.com/watch?v=gphqZTCWoZE&list=PLtnonz7r7xrqI7OS0eWwc4lrwV5zqI4r3

//-----------------------------------------------
BackForwardNavigation   앞 뒤 이동
if (Browser.CanGoBack)            {                Browser.Back();            }
if (Browser.CanGoForward)            {                Browser.Forward();            }

//-----------------------------------------------
ContextMenus  : ContextMenus 추가

//-----------------------------------------------
GettingSettingHtmlContent  : HTML 소스 얻기, 설정
private void BrowserView_OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            Dispatcher.BeginInvoke((Action) (async () =>
            {
                HtmlTextBox.Text = await BrowserView.GetSourceAsync();
            }));
        }

        private void SetHtmlButton_OnClick(object sender, RoutedEventArgs e)
        {
            BrowserView.LoadHtml("123");// HtmlTextBox.Text);
        }

//-----------------------------------------------
InjectDotNetToJavaScript  : 
RegisterJsObject() 메소드가 삭제됨(사용 불가)


//-----------------------------------------------
RemoteDebugging  : 디버깅 창 띄우기
public void InitBrowser4Debug()
        {
            //InitializeComponent();

            CefSettings settings = new CefSettings() { RemoteDebuggingPort = 8088 };
            Cef.Initialize(settings);

            browser = new ChromiumWebBrowser("about:blank");
            pictureBox1.Controls.Add(browser);
            //leftBrowser.SetValue(Grid.ColumnProperty, 0);

            bwDebug = new ChromiumWebBrowser("about:blank");
            pictureBox2.Controls.Add(bwDebug);
            //rightBrowser.SetValue(Grid.ColumnProperty, 1);

            browser.FrameLoadEnd += LeftBrowser_FrameLoadEnd;
            //browser.Address = "github.com";
            browser.Load("www.google.com");
        }

        private  void LeftBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() =>
            {
                //bwDebug.Address = "localhost:8088";
                bwDebug.Load("localhost:8088");
            }));
        }

//
Css3Basics  기본 로딩
ExecutingJavaScript  자바스크립트 실행


//-------------------------------
//자바스크립트 실행
https://github.com/cefsharptutorials/cefsharptutorials/blob/master/CefSharpTutorials/ExecutingJavaScript/MainWindow.xaml.cs
        private async void excuteJS(string str)
        {
            if (browser.CanExecuteJavascriptInMainFrame && !string.IsNullOrWhiteSpace(str))
            {
                JavascriptResponse response = await browser.EvaluateScriptAsync(str);
                _log(1, response.Result);
                if (response.Result != null)
                {
                    _log(2, response.Result.ToString(), "JavaScript Result");
                }
            }
        }




//--------------------------------------------------
// 참고만
* WebBrowser 콘트롤 사용법
- IE 사용

        //WebBrowser Class , IE(Internet Explorer)
        //https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser?view=netframework-4.8
        // Navigates to the given URL if it is valid.
        private void Navigate(String address)
        {
            if (String.IsNullOrEmpty(address)) return;
            if (address.Equals("about:blank")) return;
            if (!address.StartsWith("http://") &&
                !address.StartsWith("https://"))
            {
                address = "http://" + address;
            }
            try
            {
                webBrowser1.Navigate(new Uri(address));
            }
            catch (System.UriFormatException)
            {
                return;
            }
        }

        // Updates the URL in TextBoxAddress upon navigation.
        private void webBrowser1_Navigated(object sender,
            WebBrowserNavigatedEventArgs e)
        {
            _log(webBrowser1.Url.ToString());
        }
        //-------------------------------------------------

반응형
Posted by codens