반응형
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초 뒤 수행하도록 설정
- 기존의 자동 새로고침을 설정하지 않은 앱
- 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");
}
}
}
참고
반응형