C# WebBrowser Control 에서 Alert(javascript) 안뜨게,, 차단하기

여전히 윈폼으로 개발을 하다보면  Webbrowser control 을 사용해서   웹 element 들을 접근하거나..
소스를 가져올일이 생기는데, 뭔가 주기적으로 자동화하거나,  또는 알림( 오류 또는 Alert) 등을 무시하고…. 페이지라 열리길 바랄때가 간혹있다.  왜냐하면 alert 뜨면 클릭할때가지 대기상태가되며 , 그대로 두거나 한참 뒤에 클릭하면,,  윈폼에서 HRESULT 오류를 뿜어낸다.

이때,  javascript 오류 메세지에 대해서는 ScriptErrorSuppressed = true 로 설정하여 ,  브라우저로 부터 오류를 무력화 할 수 있다
하지만 정상적으로 사용자가 호출한 alert( “메시지”) 함수에 대해는 먹히지 않는데
이때 아래 와 같이 alert 메서드를 재정의하여 <head> 테그에 추가해서 alert 함수의 기능을 제거 하여 작동을 안하게 할수있다

Microsoft.mshtml 컴포넌트를 반드시 설치해줘야한다.
설치 프로젝트 → 참조 → 우클릭 →  어셈블리 → 확장 → Microsoft.mshtml  체크설치

// 선언한 브라우저에
WebBrowser webBrowser1 =  new WebBrowser()

// 이벤트 대리자를 추가하고
this.webBrowser1 .Navigated += WebBrowser3_Navigated;

// 이벤트 호출시 아래 호출
private void WebBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
           // alert() 을 빈함수로 초기화하는 설정이 들어있는 메서돌 초기화한다.
           this.blockScriptAlert(sender, e);
}


private void blockScriptAlert(object sender, WebBrowserNavigatedEventArgs e)
{
       WebBrowser tempWebBrowser = sender as WebBrowser;

       HtmlElement element_html_head = tempWebBrowser .Document.GetElementsByTagName(“head”)[0];
       HtmlElement element_script = tempWebBrowser .Document.CreateElement(“script”);
       mshtml.IHTMLScriptElement element = (mshtml.IHTMLScriptElement)element_script.DomElement;

      // alert 함수를 재정의
       string alertFunction = “window.alert = function () { }”;
       element.text = alertFunction;

      // 위에 재정의한 Alert 함수를 브라우저에 추가한다.
       element_html_head.AppendChild(element_script);

}

참고로  confirm 및 prompt 와 같은  다른 알림창을 차단하고자할때는 아래와 같이 작성하자
element .text = @”
        window.alert = function() { };
        window.confirm = function() { return true; };
       window.prompt = function() { return null; };
“;
head.AppendChild(scriptEl);

Posted in C#

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다