티스토리 뷰

목차

    반응형

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

    반응형