- 日時: 2012/06/10 07:52
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[インターネット][][] * * キーワード:Google検索,ログイン,自動的に,IE,ボタンをクリック,テキスト入力 * *********************************************************************************** タイトル : IEの制御の方法 記 事 No : 10229 投 稿 日 : 2010/09/30(Thu) 22:01 元質問者 : 田淵
VBのwebbrowserではなく、VBからIE自体を操作したいと思います。 以下を自動で操作したいと思います。 webbrowserだとサンプルが沢山あるので良いのですが、IE自体のの操作だと少ないですね。 getObject()でIEを捕まえると言うことは分かったのですが、具体的にどうすればよいのか 教えていただきたいです。 ■IEのTextboxに文字を代入→OK(submit)を押す。 loginやpasswdなどの"name"TAGを指定しないで、HPにtextboxが5つあるとして、 順番に上からtextboxに文字を代入していくことは可能ですか?
------------------------------------------------------------------------------------ 記事No : 10237 投稿日 : 2010/10/02(Sat) 11:28 2012/01/13 修正 回答者 : 花ちゃん
>loginやpasswdなどの"name"TAGを指定しないで と言う要望なので下記のようにしてみました。 〜 中略 〜 敢えて、解説も解放処理等も省略しておりますが、動作確認は問題なくできるはずです。
と投稿していたので、少しはまともな物をと思い作り直してみました。 個人的には、VB.NET 系で IE を扱うのは結構面倒なので、Webbrowser コントロールを使った 方法を推薦しますが、IE でないといけないのであれば、試しにテストして見てください。
Form ボタンを 3個 貼り付けて、下記のコードをコピー&ペーストして試してください。 1.Name 等で要素を特定してから操作する場合 2.事前に目的の要素が何番目にあるのかを調べておいて操作する場合 3.どのような要素が使用されているかを調査する場合 以上の3方法を実行しています。
※ 検索サイトのアドレスが色々ありますし、レイアウト等もチョクチョク変更されたり、 しておられるようなので、うまく動作しない場合は、設定を確認願います。
'=================================================================================================== 'SampleNo:SampleNo:391 2010.10.02 B 2012.01.13 'タイトル:IEを使ってのGoogle検索及びテキストボックス・ボタン等の操作例(391) − VB2010 '動作確認:Windows 7 VB2010(VS2010 Pro/SP1) Framework 4 / ターゲットCPU:X86 / IE 9 '[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 '--------------------------------------------------------------------------------------------------- 'プロジェクト→参照の追加→COM→Microsoft Internet controls を参照設定して下さい。 'プロジェクト→参照の追加→COM→Microsoft HTML Object Library を参照設定して下さい。 'ソースコードは、保存オプションの詳細設定で、日本語(シフトJIS)-コードページ932 で保存しております。 '========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
※ VB2005 等の.NET系からIEを操作する事は、Excel同様 COM オブジェクトを操作する事になり解放処理や Invoke メソッドでの呼び出し等が必要になり下記のようにVB6.0 での操作より複雑になりあまりお勧め できません。それなりの知識を持ってお使い下さい。 又、VB6.0 でも同様ですが、表示待ちに下記のような待機処理をしないで Do While objIE(w).Document.ReadyState <> "complete" DocumentComplete イベント等で表示(読み込まれた)された事を確認してから実施して下さい
Public Class Form1
#Region "本文関係の処理"
Private Sub myDocComplete(ByVal pDisp As Object, ByRef URL As Object)
'Name 等で要素を特定してから操作する場合 If SNo = 1 Then Dim ieDoc As mshtml.HTMLDocument = CType(IE.Document, mshtml.HTMLDocument) Dim elCol As mshtml.IHTMLElementCollection = CType(ieDoc.all, mshtml.IHTMLElementCollection) Dim elTxt As mshtml.HTMLInputTextElement = DirectCast(elCol.item("q"), mshtml.HTMLInputTextElement) Dim elBtn As mshtml.HTMLButtonElement = CType(elCol.item("btnG"), mshtml.HTMLButtonElement) ' _ elTxt.value = KeyWord '検索キーワードの入力用テキストボックスに書き込み elBtn.click() '検索ボタンをクリック
'Com オブジェクトの解放処理へ MRComObject(elBtn) MRComObject(elTxt) MRComObject(elCol) MRComObject(ieDoc) End If
'事前に目的の要素が何番目にあるのかを調べておいて操作する場合 If SNo = 2 Then Dim ieDoc As mshtml.HTMLDocument = DirectCast(IE.Document, mshtml.HTMLDocument) Dim elCol As mshtml.IHTMLElementCollection = _ DirectCast(ieDoc.getElementsByTagName("INPUT"), mshtml.IHTMLElementCollection) Dim elTxt As mshtml.IHTMLElement = DirectCast(elCol.item(4), mshtml.IHTMLElement) Dim elBtn As mshtml.IHTMLElement = DirectCast(elCol.item(5), mshtml.IHTMLElement) elTxt.setAttribute("value", "VBレスキュー(花ちゃん)") '検索キーワードの入力用テキストボックスに書き込み elBtn.click() '検索ボタンをクリック
'Com オブジェクトの解放処理へ MRComObject(elBtn) MRComObject(elTxt) MRComObject(elCol) MRComObject(ieDoc) End If
'どのような要素が使用されているかを調査する場合 If SNo = 3 Then Dim ieDoc As mshtml.HTMLDocument = DirectCast(IE.Document, mshtml.HTMLDocument) Dim elCol As mshtml.IHTMLElementCollection = _ DirectCast(ieDoc.getElementsByTagName("INPUT"), mshtml.IHTMLElementCollection) Dim n As Integer = -1 For Each elment As mshtml.IHTMLElement In elCol '全ての要素を取得する場合は下記のようにして 'For Each elment As mshtml.IHTMLElement In DirectCast(doc3, mshtml.HTMLDocument).all n += 1 Dim va As String = " " Dim na As String = " " Dim ty As String = " " Try '要素によっては使用されていないプロパティ等が含まれるのでエラー処理を実施 If elment.getAttribute("Type").ToString() <> "text" Then va = DirectCast(elment.getAttribute("value"), System.String) End If If elment.getAttribute("Name") Is Nothing = False Then na = elment.getAttribute("Name").ToString() End If If elment.getAttribute("Type") Is Nothing = False Then ty = elment.getAttribute("Type").ToString() End If Catch ex As Exception ' MessageBox.Show(ex.Message) End Try Console.WriteLine(n.ToString() & vbTab & elment.tagName & vbTab & ty & vbTab & na & vbTab & va) MRComObject(elment) 'Com オブジェクトの解放処理へ Next 'Com オブジェクトの解放処理へ MRComObject(elCol) MRComObject(ieDoc)
' 出力結果 ' 0 INPUT hidden sclient psy-ab ' 1 INPUT hidden hl ja ' 2 INPUT ' 3 INPUT hidden source hp ' 4 INPUT text q ' 5 INPUT submit btnK Google 検索 ' 6 INPUT submit btnI I'm Feeling Lucky
End If
End Sub
#End Region
#Region "付帯処理関係"
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click If Not (IE Is Nothing) And frgClose = False Then IE.Quit() IE = Nothing End If '同じ検索ページであってもアドレスによって違いがあります。 myUrl = "http://www.google.co.jp/" IE = New SHDocVw.InternetExplorer frgClose = False '起動中のフラグ SNo = 1 '作業No Button1 の場合の処理 KeyWord = "IE_DocumentComplete 花ちゃん" IE.Visible = True IE.Navigate2(myUrl.ToString) End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click If Not (IE Is Nothing) And frgClose = False Then IE.Quit() IE = Nothing End If '同じ検索ページであってもアドレスによって違いがあります。 myUrl = "http://www.google.co.jp/" IE = New SHDocVw.InternetExplorer frgClose = False '起動中のフラグ SNo = 2 '作業No Button2 の場合の処理 KeyWord = "VBレスキュー(花ちゃん)" IE.Visible = True IE.Navigate2(myUrl.ToString) End Sub
Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click If Not (IE Is Nothing) And frgClose = False Then IE.Quit() IE = Nothing End If '同じ検索ページであってもアドレスによって違いがあります。 myUrl = "http://www.google.co.jp/" IE = New SHDocVw.InternetExplorer frgClose = False '起動中のフラグ SNo = 3 '作業No Button3 の場合の処理 KeyWord = "" IE.Visible = True IE.Navigate2(myUrl.ToString) End Sub
Private Sub IE_DocComplete(pDisp As Object, ByRef URL As Object) Handles IE.DocumentComplete '指定のサイト以外は除去 If Not TypeName(pDisp) = "IWebBrowser2" Or URL.ToString <> myUrl Then Return 'Form 上のLabelやTextBoxに直接書き込みを行うとエラーとなるので、 '別スレッドから操作する為にInvoke メソッドでの呼び出し '詳しくは、IE_DocumentComplete イベント内での書き込み方法(VB.NET) を参照 ' http://hanatyan.sakura.ne.jp/patio/read.cgi?no=192 Invoke(New SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(AddressOf myDocComplete), pDisp, URL) End Sub
Public Shared Sub MRComObject(Of T As Class) _ (ByRef objCom As T, Optional ByVal force As Boolean = False) 'COM オブジェクトの解放処理(Excel の操作で使っていた物を流用) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) If count > 0 Then Debug.Print(count.ToString()) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) End If End If End If Finally objCom = Nothing End Try End Sub
#End Region
#Region "起動時の処理"
Private WithEvents IE As SHDocVw.InternetExplorer Private myUrl As String Private frgClose As Boolean 'IE がユーザによって閉じられたかどうかのフラグ Private SNo As Integer Private KeyWord As String
#End Region
#Region "終了時の処理(テスト用ファイルの後始末・他)"
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As _ System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 'フォームを閉じる時の処理 If Not (IE Is Nothing) Then If frgClose = False Then IE.Quit() End If System.Runtime.InteropServices.Marshal.FinalReleaseComObject(IE) IE = Nothing End If End Sub
Private Sub IE_OnQuit() Handles IE.OnQuit 'ユーザーがIEを閉じた時の処理 frgClose = True If Not (IE Is Nothing) Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(IE) IE = Nothing End If End Sub
#End Region
|