티스토리 뷰
목차
C# HTML, 웹브라우저 제어 예제, WebBrowser 컨트롤 소스
C# HTML을 사용하려면, 먼저 브라우저에 이벤트를 등록하고 링크를 걸어줍니다. 비주얼 스튜디오 도구 상자에 있는 WebBrowser 컨트롤을 이용하며, URL은 웹브라우저 객체의 Navigate 함수의 인자로 전달합니다.
1 2 3 4 5 | this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler (this.webBrowser1_DocumentCompleted); this.webBrowser1.Navigate("http://www.egloos.com/"); | cs |
웹브라우저 로딩 후 태그 분류. (가장 기본적인 형식)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete) { // WebBrowser 컨트롤 문서 로드가 완료 되었을 경우 foreach (HtmlElement elements in this.webBrowser1.Document.Body.Children) { // 모든 요소 마다 반복 foreach (HtmlElement element in elements.All) { // 하위요소의 모든 객체를 추출 switch(element.TagName) { // 태그이름으로 검사(이미지, 링크태그등.._) case "IMG" : // 이름으로 검색된 속성값을 가져온다. MessageBox.Show(element.GetAttribute("SRC")); break; case "A" : // 이름으로 검색된 속성값을 가져온다. MessageBox.Show(element.GetAttribute("HREF")); break; } } }}} | cs |
- 응용. 웹브라우저 Submit 실행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void abc() { foreach (HtmlElement elements in webBrowser1.Document.All) { if (elements.TagName == "INPUT") { // Input 태그 이용 try { elements.SetAttribute("VALUE", label2.Text); // label2의 텍스트를 VALUE란 INPUT 태그로 복사, WebBroswer 컨트롤 //elements.Document.InvokeScript("showAddress", new object[] { label2.Text }); //webBrowser1.Document.InvokeScript("showAddress", new object[] { label2.Text }); elements.InvokeMember("submit"); elements.InvokeMember("SUBMIT"); // SUBMIT 실행 이는, 마우스로 클릭하는 것과 같은 역할 break; } catch { } } } } | cs |
구조도(아래 그림)
[C# WebBroswer 컨트롤] 클래스
그리고 간단한 예제(웹브라우저 페이지 자동 넘김)를 하나 더 살펴보겠습니다.
HtmlElement는 일반적으로 foreach를 사용해, 각종 요소를 일단 읽어 들인 후, 개별 요소들을 분별해 처리하는 과정이 요구됩니다. 예를 들면, 아래와 같이 말이죠.
1 2 3 | foreach (HtmlElement elements in webBrowser1.Document.All) { .... | cs |
foreach문을 통해서 webBrowser1의 문서상에 존재하는 모든 요소를 읽어냅니다. 그리고 난 뒤, 사용자가 원하는 요소를 추출합니다. HtmlElement의 객체는 elements이고, 요소 구분은 TagName으로 이루어집니다.
1 2 3 | if (elements.TagName == "INPUT") { .... | cs |
위의 소스 코드는, 웹브라우저 INPUT 형태의 Button 요소를 처리하는 코드입니다. 그렇지만, 많은 수의 INPUT Button이 있을 수 있으므로, if 문 내부에 새롭게 원하는 Button을 찾아내는 코드가 필요합니다.
1 2 3 4 5 | elements.SetAttribute("VALUE", label2.Text); elements.Document.InvokeScript("showAddress", new object[] { label2.Text }); webBrowser1.Document.InvokeScript("showAddress", new object[] { label2.Text }); elements.InvokeMember("submit"); //elements.InvokeMember("SUBMIT"); | cs |
위와 같은 코드를 통해서, label2의 Text를 가져와 마지막 줄에서 submit을 동작시킵니다. submit이 소문자일 경우 실행되지 않는 경우가 있는데, 아래 주석 줄처럼 대문자로 바꿔주면, 동작합니다.
그래서, 코드를 합치면 HTML 웹 페이지의 label2의 Text와 같은 Value를 갖는 INPUT Button을 눌러주는 효과를 얻게 됩니다.
ps. MSDN도 참조하세요
C# HTML, 웹브라우저 제어 예제, WebBrowser 컨트롤 소스