tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
IEを使ってGoogle検索及びTextBox・ボタン等の操作例(VB.NET) ( No.0 )  [親スレッドへ]
日時: 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



 [スレッド一覧へ] [親スレッドへ]