본문 바로가기
C++ 200제/코딩 IT 정보

C# HTML, 웹브라우저 제어 예제, WebBrowser 컨트롤 소스

by vicddory 2017. 4. 21.

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 컨트롤 소스

댓글