2011年12月14日水曜日

WebBrowserコントロールで要素に値を入力

WebBrowserコントロールのフォームに任意の値を自動入力する方法をメモ。
社内で使用する業務用WebアプリをWindowsアプリケーションの中で扱えないかと思い,WebBrowserコントロールを使ってみました。
アカウント認証が必要なので,アカウント情報を自動入力して送信します。

まずはテキストボックスへの入力とボタンクリックのメソッドを用意。

    ''' 
    ''' 指定のURLに接続します。
    ''' 
    ''' URL
    ''' 
    Public Sub SetUrl(ByVal url As String)

        webBrowser1.Navigate(url)

    End Sub

    ''' 
    ''' ウェブページ内のテキストボックスに文字列を入力します。
    ''' 
    ''' 要素ID
    ''' 文字列
    ''' 
    Public Sub SetStringToTextBox(ByVal elementId As String, ByVal value As String)

        Dim all As HtmlElementCollection = webBrowser1.Document.All
        Dim forms As HtmlElementCollection = all.GetElementsByName(elementId)
        If forms.Count > 0 Then
            forms(0).InnerText = value
        End If

    End Sub

    ''' 
    ''' ウェブページ内のボタンをクリックします。
    ''' 
    ''' 要素ID
    ''' 
    Public Sub ClickWebButton(ByVal elementId As String)

        Dim all As HtmlElementCollection = webBrowser1.Document.All
        Dim forms As HtmlElementCollection = all.GetElementsByName(elementId)
        If forms.Count > 0 Then
            forms(0).InvokeMember("click")
        End If

    End Sub

Webページの読み込みが完了した時点で自動入力して送信。


    Private Sub webBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles webBrowser1.DocumentCompleted

        SetStringToTextBox("Account", "myAccount")
        SetStringToTextBox("Password", "myPassword")
        ClickWebButton("Submit")

    End Sub

うまくいったのはいいけど,別ウィンドウを表示する動作で認証が途切れてしまいました。 セッションのことまで考えるとなかなか単純にはいかないようです。 別ウィンドウでのセッション維持が不要なら,使えそうです。