C# - CefSharp(크롬 기반 Webview) - 설치, 사용 방법

 

CefSharp 설치

  • 프로젝트 우클릭 - NuGet 패키지 관리

 

  • 'CefSharp' 키워드로 검색하여 설치
    • CefSharp.Wpf : Wpf 기반 프로젝트에서 사용
    • CefSharp.WinForms : Winforms 기반 프로젝트에서 사용
    • CefSharp.Common : Wpf, Winforms 둘 다 포함


ChromiumWebBrowser 컨트롤 생성

  • 코드
// 웹 브라우저 인스턴스 생성
ChromiumWebBrowser browser = new ChromiumWebBrowser();

// CefSharp 설정 초기화
Cef.Initialize(new CefSettings());

// 웹 브라우저 사이즈 설정, 자신에게 맞는 사이즈로 변경
browser.Size = new Size(this.ClientSize.Width, this.ClientSize.Height);
browser.Location = new Point(0, 0);

// 폼에 웹 브라우저 추가
this.Controls.Add(browser);

// 웹 페이지 호출
browser.LoadUrl("https://google.com");

 

  • 실행 화면


자바스크립트 실행

  • 코드
    • 제일 중요한 부분 : EvaluateScriptAsync(스크립트)
    • 단독으로 한 줄만 작성할 경우 프레임을 찾지 못해 에러 출력
// 페이지가 로딩 된 후 자바스크립트 실행
browser.FrameLoadEnd += async (sender, args) =>
{
	// 프레임이 메인일 경우
    if (args.Frame.IsMain)
    {
        // 기본 프레임에 대한 참조 호출
        var frame = args.Frame;

        // 자바스크립트 함수 실행
        var result = await frame.EvaluateScriptAsync(script);

        // 자바스크립트 실행 결과
        if (result.Success)
        {
            // 성공 시 작성할 코드
        }
        else
        {
            // 실패 시 작성할 코드
        }
    }
};

 

  • 실행 화면
    • EvalueateScriptAsync 함수에 알럿 입력
    • var result = await frame.EvaluateScriptAsync("alert('Hello!')");


페이지 자동 새로고침

  • 코드
public Form1()
{
	// browser(ChromiumWebBrowser 인스턴스)의 상태가 변할 경우
	browser.LoadingStateChanged += Browser_LoadingStateChanged;
}

private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
	// 브라우저의 상태가 로딩중이 아닐 경우
    if (!e.IsLoading)
    {
    	// 브라우저가 메인 프레임에서 자바스크립트 실행을 하지 않은 경우
        if (!browser.CanExecuteJavascriptInMainFrame)
        	// 브라우저 새로고침
            browser.Reload();
    }
}

 

  • 실행 화면
    • 테스트를 위해 자바스크립트를 3초 뒤 수행하도록 설정
      • await Task.Delay(3000);
  • 기존의 자동 새로고침을 설정하지 않은 앱
    • 3초가 지나도 알럿이 출력되지 않음

 

  • LoadingStateChange 메서드를 추가할 앱
    • 3초가 지나면 알럿 출력


전체 소스 코드

using CefSharp.WinForms;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;

namespace CefSharpTest
{
    public partial class Form1 : Form
    {
        // 크롬 브라우저 인스턴스 생성
        ChromiumWebBrowser browser = new ChromiumWebBrowser();

        public Form1()
        {
            InitializeComponent();

			// 크롬 브라우저 초기화
            InitializeCefSharp();

			// 크롬 브라우저 상태 변경 시 자동 새로고침
            browser.LoadingStateChanged += Browser_LoadingStateChanged;

			// 자바스크립트 실행 스크립트
            WebBrowserJavascriptCall("alert('hello')");
        }
        
        /* 크롬 브라우저 자동 새로고침 */
        private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
        {
            if (!e.IsLoading)
            {
                if (!browser.CanExecuteJavascriptInMainFrame)
                    browser.Reload();
            }
        }

		/* 크롬 브라우저 자바스크립트 실행 */
        private async void WebBrowserJavascriptCall(string script)
        {
            // 페이지가 로딩 된 후 자바스크립트 실행
            browser.FrameLoadEnd += async (sender, args) =>
            {
            	// 브라우저 메인 프레임 객체 생성
                var frame = browser.GetMainFrame();
                
                // 3초 대기
                await Task.Delay(3000);
                
                // 자바스크립트 함수 실행
                var result = await frame.EvaluateScriptAsync(script);

                // 자바스크립트 실행 결과
                if (result.Success)
                {
                    // 성공 시 수행 코드
                }
                else
                {
                    // 실패 시 수행 코드
                }
            };
        }

		// 크롬 브라우저 초기화
        private void InitializeCefSharp()
        {
        	// 크롬 브라우저 설정 초기화
            Cef.Initialize(new CefSettings());

            // 크롬 브라우저 크기 설정
            browser.Size = new Size(this.ClientSize.Width, 300);
            browser.Location = new Point(0, 0);

            // 폼에 크롬 브라우저 추가
            this.Controls.Add(browser);

            // 웹 페이지 로드
            browser.LoadUrl("https://www.google.com");
        }
    }
}

참고

CefSharp Wiki