728x90

Web 로그인 화면을 띄우고 ID 와 PW를 입력하고 클릭하면 로그인된 화면이 보일 것이다.

이 기능을 C#에서 처리하는 방법이다.

아주 간단하게 기능만 테스트 해 본 거라 username 과 password 를 직접 입력하는 방식으로 구현해봤지만 자동로그인하면서 저장한 값을 불러다가 처리하는 것이 좋을 듯하다.


webBrowser1.Document.GetElementById("username").InnerText = "xxxxx";

대신에

webBrowser1.Document.GetElementById("username").SetAttribute("value", "xxxxx") ;

를 해도 결과는 동일하다.


InvokeMember("click") : 스크립트 언어로 현재 HTML 페이지에 정의된 함수를 실행한다.

WebBrowser 로딩이 끝났을 때 실행해야 한다.


webBrowser1_DocumentCompleted 메소드는 브라우져에 웹페이지가 모두 Load 되었을 때 발생하는 이벤트다.

이것과 동일하게 처리하는 것이

while (webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
{
    Application.DoEvents();
}


Web 화면을 읽어오고 나서 Loading 이 완전히 끝나지 않은 상태에서 값을 전달하면 null 에러가 발생한다.



private void Form1_Load(object sender, EventArgs e)
{
   // From Web
    var url = "http://aaa.com/?r=home&system=iframe.login&iframe=Y&referer=%2F%3F";
    webBrowser1.Navigate(url);
    webBrowser1.ScriptErrorsSuppressed = true;
    while (webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }


    HtmlDocument doc = webBrowser1.Document;

    doc.GetElementById("username").InnerText = "xxxxx";
    doc.GetElementById("password").InnerText = "yyyyy";
    // 특정 엘리먼트를 호출하여 이벤트 처리
    webBrowser1.Document.GetElementById("login_btn").InvokeMember("click");

}

private void SuppressScriptErrorsOnly(WebBrowser browser)
{
    // Ensure that ScriptErrorsSuppressed is set to false.
    browser.ScriptErrorsSuppressed = false;

    // Handle DocumentCompleted to gain access to the Document object.
    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(
            webBrowser1_DocumentCompleted);
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    ((WebBrowser)sender).Document.Window.Error +=  new HtmlElementErrorEventHandler(Window_Error);          
}

private void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
    // Ignore the error and suppress the error dialog box.
    e.Handled = true;
}


참고하면 도움될 사이트

https://stackoverflow.com/questions/32904235/c-sharp-get-element-by-name


https://stackoverflow.com/questions/16787495/click-on-html-element-by-class-using-webbrowser-c-sharp


https://ddingjo.blogspot.kr/2017/04/c-html.html

728x90

'C# > 통신' 카테고리의 다른 글

C# 과 Web  (0) 2018.03.10
C# Web 접속 로그인함수 만들기(HttpClient 방식)  (0) 2016.11.14
C# webFile 다운로드 함수  (0) 2016.11.12
C# GetAsyncDataFromWeb  (0) 2016.08.21
C# GetDataFromWeb 사용자 함수  (0) 2016.08.20
블로그 이미지

Link2Me

,