トップ回答者
webbrowserのボタンクリック

質問
-
こんにちは
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
回答
-
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 SnippetPublic Class Form1
' "Check All" ボタンがクリック済みか否かの識別用フラグ
Private checkAllClicked As Boolean = False' "削除" ボタンのクリックまで進んで、操作が完了したか否かの識別用フラグ
Private complete As Boolean = FalsePrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WebBrowser1.Navigate(TextBox1.Text)
End SubPrivate Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If complete Then
Exit Sub
End IfIf 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 -
akisan さんからの引用 checkallボタンを押すとページがリロードされチェックが付きます。
現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています
が効率が悪いので1つのボタンを押す事で両方できないかと思っています。
了解です。であれば、以下のコードでいけるかもしれません。
Code SnippetPrivate 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
すべての返信
-
<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="削除">のボタンを押したいのです。
-
つまり2回続けてsubmitしたいということなんですね?
であれば、最初の
WebBrowser1.Document.All.GetElementsByName("checkall")(0).InvokeMember("click")
の際に適当なフラグ、例えばsubmitFlgをtrueにしておき、WebBrowser1のDocumentCompletedイベントでsubmitFlgがtrueであれば、
WebBrowser1.Document.Forms(0).InvokeMember("submit")
を実行するようにすればいいんじゃないかと思います。
-
こんにちは
一応下記のようにしてみましたが
チェックボタンはおせるのですがやはり次の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 = FalseWhile 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を勉強しだしたのでまだまだ理解するのが難しいです。
-
<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つのボタンを押す事で両方できないかと思っています。
-
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 SnippetPublic Class Form1
' "Check All" ボタンがクリック済みか否かの識別用フラグ
Private checkAllClicked As Boolean = False' "削除" ボタンのクリックまで進んで、操作が完了したか否かの識別用フラグ
Private complete As Boolean = FalsePrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WebBrowser1.Navigate(TextBox1.Text)
End SubPrivate Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If complete Then
Exit Sub
End IfIf 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 -
akisan さんからの引用 checkallボタンを押すとページがリロードされチェックが付きます。
現在、フォームにボタン2つ付け1つでcheckallボタンを押し、もう1つで削除ボタンを押しています
が効率が悪いので1つのボタンを押す事で両方できないかと思っています。
了解です。であれば、以下のコードでいけるかもしれません。
Code SnippetPrivate 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 -
akisan さんからの引用 こんにちは
お二人のコードを見るとPrivate Sub webBrowser1_DocumentCompletedがありますが
これがDocumentCompletedイベントというやつですね
これはwebbrowserが表示したら常に実行しているのですか?
subの使い方がまだハッキリ理解していないので作っていただいたコードを試して見ます。
すみません。私のコードはC#をコンバートしたものでして、Handlesが抜けています。SurferOnWwwさんのコードを参考にして付加して下さい。
DocumentCompletedはブラウザが読み込みを完了した時点で発動します。つまり、最初のallcheckボタンを押した後、全てのチェックが付いた状態でブラウザに表示完了した時点で発動しますので、そのタイミングでふたたびsubmitボタンを押しているわけです。ただし、SurferOnWwwさんも言われていますが、削除ボタンにnameが無いので、そこら辺りに注意が必要かもしれません。