none
webbrowserのボタンクリック RRS feed

  • 質問

  • こんにちは

    webbrowser上の2つのボタン押すにはどうすればいいですか?

    nameがcheckallと言うボタンとnameなしのボタンがあるのですが

    checkallと言うボタンは押す事ができたのですがnameの無いsubmitボタンを押すにはどうすればいいですか?

     

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            WebBrowser1.Navigate(TextBox5.Text)

            While WebBrowser1.IsBusy
                Application.DoEvents()

            End While


            Me.WebBrowser1.ScriptErrorsSuppressed = True
            While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
                Application.DoEvents()

            End While
            WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
           
            WebBrowser1.Document.All.GetElementsByName("submit")(0).InvokeMember("click")
        End Sub

    2008年11月10日 3:36

回答

  • 以下で可能だと思います。

     

    webBrowser1.Document.Forms[0].InvokeMember("submit");

    2008年11月10日 4:14
    モデレータ
  • HTML ソースはどのようになっているのですか?

     

     

    2008年11月10日 11:17
  •  akisan さんからの引用

    現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています

    が効率が悪いので1つのボタンを押す事で両方できないかと思っています。

     

    "削除" ボタンに name が無いということは、多分、サーバー側で value を取得できないの
    で form の submit でも、"削除" ボタンのクリックでも同じではないかと思いますが、ど
    うしても "削除" ボタンをクリックしたいなら、

     

    WwebBrowser1.Document.GetElementsByTagName("input")

     

    で input タグの HtmlElementCollection を取得して、その中で value 属性が "削除" にな
    っているの HtmlElement を探し、それに InvokeMember("click") とすればクリックできる
    はずです。

     

    ただし、"削除" ボタンをクリックするタイミングで、WebBrowser による Document の読み
    込みが完了していて、その Document の中に "削除" ボタンの input タグがあるのが条件

    です。

    "Check All" ボタンをクリックした後に "削除" ボタンが存在するかどうかは、その Web Site

    の作り方によるので、実際に "削除" ボタンをクリック出来るかどうかはわかりませんが、試

    してみますか?

     

    ASP.NET Web アプリのように、"Check All" ボタンをクリックした後、ポストバックがかか
    って、同じページが再描画されるような作りになっていれば、以下のようなコードでできる
    と思います。

     

    Code Snippet

    Public Class Form1
        ' "Check All" ボタンがクリック済みか否かの識別用フラグ
        Private checkAllClicked As Boolean = False

        ' "削除" ボタンのクリックまで進んで、操作が完了したか否かの識別用フラグ
        Private complete As Boolean = False

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            WebBrowser1.Navigate(TextBox1.Text)
        End Sub

        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            If complete Then
                Exit Sub
            End If

            If checkAllClicked Then
                Dim elements As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
                For Each element As HtmlElement In elements
                    If element.GetAttribute("value") = "削除" Then
                        element.InvokeMember("click")
                        complete = True
                        Exit For
                    End If
                Next
            Else
                WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
                checkAllClicked = True
            End If
        End Sub
    End Class

     

     

    2008年11月11日 13:39
  •  akisan さんからの引用

    checkallボタンを押すとページがリロードされチェックが付きます。

    現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています

    が効率が悪いので1つのボタンを押す事で両方できないかと思っています。

     

    了解です。であれば、以下のコードでいけるかもしれません。

     

    Code Snippet

        Private submitflg As Boolean = False 
        
        Private Sub cbtn_checkAndButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            submitflg = True 
            webBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
        End Sub
       
        Private Sub webBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
            If submitflg Then
                webBrowser1.Document.Forms(0).InvokeMember("submit") 

            submitflg = False
            End If
        End Sub

     

     


    2008年11月12日 1:15
    モデレータ

すべての返信

  • 以下で可能だと思います。

     

    webBrowser1.Document.Forms[0].InvokeMember("submit");

    2008年11月10日 4:14
    モデレータ
  •  

    こんばんは

     WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")

    でボタンをクリックするとリロードされチェックボックスにチェックがつくのですが

    webBrowser1.Document.Forms(0).InvokeMember("submit")

    を最後に付け足してもチェックボックスにチェックがつく前に次のsubmitボタンが押されます。

     

    2008年11月10日 10:54
  • HTML ソースはどのようになっているのですか?

     

     

    2008年11月10日 11:17
  • <form method=post><tr><td><font face=arial></td><td><font face=arial></td><td><font face=arial><center><input type=submit name=checkall value="Check All"><br><input type=submit value="削除">

     

     

    WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
    で<input type=submit name=checkall value="Check All">を押してから

    WebBrowser1.Document.Forms(0).InvokeMember("submit")

    で<input type=submit value="削除">のボタンを押したいのです。

     

    2008年11月10日 23:44
  • つまり2回続けてsubmitしたいということなんですね?

    であれば、最初の

    WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")

    の際に適当なフラグ、例えばsubmitFlgをtrueにしておき、WebBrowser1のDocumentCompletedイベントでsubmitFlgがtrueであれば、

    WebBrowser1.Document.Forms(0).InvokeMember("submit")

    を実行するようにすればいいんじゃないかと思います。

    2008年11月11日 0:44
    モデレータ
  • こんにちは

    一応下記のようにしてみましたが

    チェックボタンはおせるのですがやはり次のsubmitボタンが反応しません

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            WebBrowser1.Navigate(TextBox5.Text)
            Dim submitflg As Boolean = False

            While WebBrowser1.IsBusy
                Application.DoEvents()

            End While


            Me.WebBrowser1.ScriptErrorsSuppressed = True
            While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
                Application.DoEvents()

            End While
            WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
            While WebBrowser1.IsBusy
                Application.DoEvents()

            End While


            Me.WebBrowser1.ScriptErrorsSuppressed = True
            While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
                submitflg = True
                Application.DoEvents()

            End While


            If submitflg = True Then
                WebBrowser1.Document.Forms(0).InvokeMember("submit")
            Else
               
            End If
        End Sub

    すみません最近VBを勉強しだしたのでまだまだ理解するのが難しいです。

    2008年11月11日 3:47
  • 最初のcheckallのボタンですが、これをクリックするとjavascriptによってチェックボタンにチェックが入るのでしょうか? それともサブミットまたはポストバックが行われた結果、チェックボックスにチェックが入るのでしょうか? この違いにより、後のサブミットボタンを押すタイミングが異なります。

     

    2008年11月11日 4:38
    モデレータ
  • こんにちは

    <form method=post>

    <input type=checkbox value="1" name=inbox_mes[***]>

    とありますのでJAVAスクリでは無いとおもいます。

     

    2008年11月11日 7:44
  • この部分は普通のHTMLなので、これだけでは判断できません・・・。SurferOnWwwさんが言われているように、可能な範囲でHTMLソースを見せていただけませんか?

    2008年11月11日 9:27
    モデレータ
  •  

    <table width="98%" border="0" cellspacing="5" cellpadding="5" align="center">
    <tr>
    <td align="center" valign="top">

    <br>
    <b>
    あなたのinboxに2件のメッセージがあります。 <br></b>
    <font size=-2>(15日経過すると自動的に削除されます)</font><br>
    <table border=1>
    <tr>
    <th><font size="2">日時</font></th>
    <th><font size="2">表題</font></th>
    <th><font size="2">削除</font></th>
    </tr>
    <form method=post><tr><td><font face=arial></td><td><font face=arial></td><td><font face=arial><center><input type=submit name=checkall value="Check All"><br><input type=submit value="削除"></center></td></tr><tr><td><font face=arial>11/11/2008 16:10</td><td><font face=arial><a href=http://*********** target=_inbox>aaaaaaaaaaaaa</a></td><td><font face=arial><center><input type=checkbox value="1" name=inbox_msg[6123.] ></center></td></tr><tr><td><font face=arial>11/11/2008 01:10</td><td><font face=arial><a href=http://********************** target=_inbox>bbbbbbbbbbbbbb</a></td><td><font face=arial><center><input type=checkbox value="1" name=inbox_msg[6122.] ></center></td></tr></form></table>
    </center>
    </TD></TR></TABLE>

    です。

    <head>タグにもJAVAの記載はないです。

    いわゆる、リードメールサイトのinboxです。

    checkallボタンを押すとページがリロードされチェックが付きます。

    現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています

    が効率が悪いので1つのボタンを押す事で両方できないかと思っています。

    2008年11月11日 9:58
  •  akisan さんからの引用

    現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています

    が効率が悪いので1つのボタンを押す事で両方できないかと思っています。

     

    "削除" ボタンに name が無いということは、多分、サーバー側で value を取得できないの
    で form の submit でも、"削除" ボタンのクリックでも同じではないかと思いますが、ど
    うしても "削除" ボタンをクリックしたいなら、

     

    WwebBrowser1.Document.GetElementsByTagName("input")

     

    で input タグの HtmlElementCollection を取得して、その中で value 属性が "削除" にな
    っているの HtmlElement を探し、それに InvokeMember("click") とすればクリックできる
    はずです。

     

    ただし、"削除" ボタンをクリックするタイミングで、WebBrowser による Document の読み
    込みが完了していて、その Document の中に "削除" ボタンの input タグがあるのが条件

    です。

    "Check All" ボタンをクリックした後に "削除" ボタンが存在するかどうかは、その Web Site

    の作り方によるので、実際に "削除" ボタンをクリック出来るかどうかはわかりませんが、試

    してみますか?

     

    ASP.NET Web アプリのように、"Check All" ボタンをクリックした後、ポストバックがかか
    って、同じページが再描画されるような作りになっていれば、以下のようなコードでできる
    と思います。

     

    Code Snippet

    Public Class Form1
        ' "Check All" ボタンがクリック済みか否かの識別用フラグ
        Private checkAllClicked As Boolean = False

        ' "削除" ボタンのクリックまで進んで、操作が完了したか否かの識別用フラグ
        Private complete As Boolean = False

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            WebBrowser1.Navigate(TextBox1.Text)
        End Sub

        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            If complete Then
                Exit Sub
            End If

            If checkAllClicked Then
                Dim elements As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
                For Each element As HtmlElement In elements
                    If element.GetAttribute("value") = "削除" Then
                        element.InvokeMember("click")
                        complete = True
                        Exit For
                    End If
                Next
            Else
                WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
                checkAllClicked = True
            End If
        End Sub
    End Class

     

     

    2008年11月11日 13:39
  •  akisan さんからの引用

    checkallボタンを押すとページがリロードされチェックが付きます。

    現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています

    が効率が悪いので1つのボタンを押す事で両方できないかと思っています。

     

    了解です。であれば、以下のコードでいけるかもしれません。

     

    Code Snippet

        Private submitflg As Boolean = False 
        
        Private Sub cbtn_checkAndButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            submitflg = True 
            webBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
        End Sub
       
        Private Sub webBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
            If submitflg Then
                webBrowser1.Document.Forms(0).InvokeMember("submit") 

            submitflg = False
            End If
        End Sub

     

     


    2008年11月12日 1:15
    モデレータ
  • こんにちは

    お二人のコードを見るとPrivate Sub webBrowser1_DocumentCompletedがありますが

    これがDocumentCompletedイベントというやつですね

    これはwebbrowserが表示したら常に実行しているのですか?

    subの使い方がまだハッキリ理解していないので作っていただいたコードを試して見ます。

    2008年11月12日 3:39
  •  akisan さんからの引用

    こんにちは

    お二人のコードを見るとPrivate Sub webBrowser1_DocumentCompletedがありますが

    これがDocumentCompletedイベントというやつですね

    これはwebbrowserが表示したら常に実行しているのですか?

    subの使い方がまだハッキリ理解していないので作っていただいたコードを試して見ます。

     

    すみません。私のコードはC#をコンバートしたものでして、Handlesが抜けています。SurferOnWwwさんのコードを参考にして付加して下さい。

    DocumentCompletedはブラウザが読み込みを完了した時点で発動します。つまり、最初のallcheckボタンを押した後、全てのチェックが付いた状態でブラウザに表示完了した時点で発動しますので、そのタイミングでふたたびsubmitボタンを押しているわけです。ただし、SurferOnWwwさんも言われていますが、削除ボタンにnameが無いので、そこら辺りに注意が必要かもしれません。

    2008年11月12日 4:49
    モデレータ