tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルIEの制御の方法
記事No10229
投稿日: 2010/09/30(Thu) 22:01
投稿者田淵
VBのwebbrowserではなく、VBからIE自体を操作したいと思います。

以下を自動で操作したいと思います。
webbrowserだとサンプルが沢山あるので良いのですが、IE自体のの操作だと少ないですね。

getObject()でIEを捕まえると言うことは分かったのですが、具体的にどうすればよいのか教えていただきたいです。

■IEのTextboxに文字を代入→OK(submit)を押す。


XP3/VB2005

[ツリー表示へ]
タイトルRe: IEの制御の方法
記事No10231
投稿日: 2010/10/01(Fri) 07:59
投稿者花ちゃん
> VBのwebbrowserではなく、VBからIE自体を操作したいと思います。
>
> 以下を自動で操作したいと思います。
> webbrowserだとサンプルが沢山あるので良いのですが、IE自体のの操作だと少ないですね。
>
> getObject()でIEを捕まえると言うことは分かったのですが、具体的にどうすればよいのか教えていただきたいです。
>
> ■IEのTextboxに文字を代入→OK(submit)を押す。

VB6.0 のサンプルを少し変更するだけで使用できます。
但し、VB2005 から使用する場合は、COM オブジェクトを使用する事になるので解放処理等が
必要になり、お勧めはできませんが。

下記等を参考に試して見て下さい。

 http://hanatyan.sakura.ne.jp/patio/read.cgi?no=192
 http://hanatyan.sakura.ne.jp/patio/read.cgi?no=176

 又、SHDocVw.InternetExplorer Invoke をキーに検索しても色々見つかるかと。

[ツリー表示へ]
タイトルRe^2: IEの制御の方法
記事No10232
投稿日: 2010/10/01(Fri) 17:22
投稿者田淵
loginやpasswdなどの"name"TAGを指定しないで、HPにtextboxが5つあるとして、順番に上からtextboxに文字を代入していくことは可能ですか?

よろしくお願い致します。

>.Document.Forms(0).Elements("login").Value ="ログイン用IDを記入"

[ツリー表示へ]
タイトルRe^3: IEの制御の方法
記事No10233
投稿日: 2010/10/01(Fri) 17:54
投稿者魔界の仮面弁士
> loginやpasswdなどの"name"TAGを指定しないで、
name は、`TAG` というよりは `属性` ですね。

> HPにtextboxが5つあるとして、順番に上からtextboxに文字を代入していくことは可能ですか?
上からというのは、HTML コード内の出現順のことですか?
それとも、画面上の位置の事ですか?

position 指定されていた場合、HTML の出現順と画面上の位置は
必ずしも一致しないため、単純に「上から」というのも難しいですが、
とりあえず、GetElementsByTagName メソッドで INPUT 要素を列挙して、
その中で、type 属性の値が "text" な物を抽出すれば良いかと思います。

複数行テキストボックスも得るなら TEXTAREA 要素も探す必要があるかな。

[ツリー表示へ]
タイトルRe^4: IEの制御の方法
記事No10235
投稿日: 2010/10/01(Fri) 19:46
投稿者田淵
魔界の仮面弁士さん

> > loginやpasswdなどの"name"TAGを指定しないで、
> name は、`TAG` というよりは `属性` ですね。

失礼しました。
属性ですね。

>
> position 指定されていた場合、HTML の出現順と画面上の位置は
> 必ずしも一致しないため、単純に「上から」というのも難しいですが、
> とりあえず、GetElementsByTagName メソッドで INPUT 要素を列挙して、
> その中で、type 属性の値が "text" な物を抽出すれば良いかと思います。
>

これは、webbrowser内で操作するときと一緒と考えて良いのでしょうか?


> 複数行テキストボックスも得るなら TEXTAREA 要素も探す必要があるかな。

[ツリー表示へ]
タイトルRe^2: IEの制御の方法
記事No10234
投稿日: 2010/10/01(Fri) 19:41
投稿者田淵
花ちゃんさん、返信有り難うございます。

参考に、いろいろと試してみようと思ったのですが、SHDocVw.DLLを参照設定しようとすると、「・・・参照を追加できませんでした。ファイルにアクセス出来て、有効なアセンブリであること、またCOMコーポネントであることを確認してください」とでます。

以下のサイトからDLしたのですが、ファイルが壊れていると言うことでしょうか?
http://jp.dll-download-system.com/dlls-s-/shdocvw.dll.html


-------------------------
自己解決しました。
windows-system32から参照したら問題なかったです。
ご迷惑おかけしました。

[ツリー表示へ]
タイトルRe^3: IEの制御の方法
記事No10236
投稿日: 2010/10/01(Fri) 23:17
投稿者田淵
現在、いろいろ試行錯誤しているのですが、IEは立ち上がるのですが、textboxに文字がなかなか入ってくれないですね。

エラーは起きないので、ますます分かりません。
私が使用しているのは、IE7なのですが、バージョンによって出来る出来ないとかあるでしょうか?


花ちゃんさんに教えていただいた、こちらを主に参考にさせていただいています。

http://hanatyan.sakura.ne.jp/patio/read.cgi?no=176

[ツリー表示へ]
タイトルRe^4: IEの制御の方法
記事No10237
投稿日: 2010/10/02(Sat) 11:28
投稿者花ちゃん
> 現在、いろいろ試行錯誤しているのですが

検索して調べれば、サンプルコードはいくらでも見つかりますよ。
魔界の仮面弁士 さんの回答にあったように下記のようなツールを作っておき
前もって、何番目の要素かを調べて置きそれに対して操作をすればよいかと。
http://www.hanatyan.sakura.ne.jp/samplepic/vb8_237.htm

一度下記を試して見て解らない所は、調べて試すようにして見て下さい。
WEBページは同じ物が無いと言っても過言ではなく、そのページ内容に合ったような
コードが要求されるので、ご自分で基礎的な事は理解しておかないと応用が利かないので
結局うまく取得できませんと言う事になります。

>loginやpasswdなどの"name"TAGを指定しないで
と言う要望なので下記のようにしてみました。

Public Class Form1

Private WithEvents IE As SHDocVw.InternetExplorer
Private myUrl As String

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
   If Not (IE Is Nothing) Then
      IE.Quit()
      IE = Nothing
   End If
   myUrl = "http://www.google.co.jp/custom"
   IE = New SHDocVw.InternetExplorer
   IE.Visible = True
   IE.Navigate2(myUrl.ToString)
End Sub

Private Sub IE_DocumentComplete(ByVal pDisp As Object, ByRef URL As Object) Handles IE.DocumentComplete
  If Not TypeName(pDisp) = "IWebBrowser2" Or URL.ToString <> myUrl Then Return
  Invoke(New SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(AddressOf foo), pDisp, URL)
End Sub

Private Sub foo(ByVal pDisp As Object, ByRef URL As Object)
   Dim Elements As mshtml.IHTMLElementCollection = DirectCast(DirectCast(IE.Document,  _
            mshtml.HTMLDocument).all.tags("INPUT"), mshtml.IHTMLElementCollection)
   Dim Element As mshtml.IHTMLElement = DirectCast(Elements.item(1), mshtml.IHTMLElement)
   Element.setAttribute("value", "VBレスキュー(花ちゃん)")
   Element = DirectCast(Elements.item(2), mshtml.IHTMLElement)
   Element.click()
End Sub

End Class

2010.10.02  22:30 修正

敢えて、解説も解放処理等も省略しておりますが、動作確認は問題なくできるはずです。

[ツリー表示へ]
タイトルRe^5: IEの制御の方法
記事No10238
投稿日: 2010/10/02(Sat) 17:25
投稿者田淵
花ちゃんさん、コード有り難うございます。
色々と試行錯誤しています。

初歩的な質問ですみません。

参照で、「Microsoft HTML Oject Library」を追加しました。
「Microsoft Internet Controls」最初から入っていました。
他にも参照で追加するものはあるでしょうか?



Elements
エラー    1    インターフェイス 'mshtml.IHTMLElementCollection' には既定のプロパティがないため、インデックス処理を実行できません。    

[ツリー表示へ]
タイトルRe^6: IEの制御の方法
記事No10239
投稿日: 2010/10/02(Sat) 19:45
投稿者keisuke
こんばんはです。
おおざっぱですが、こん感じでしょうか?

HMTLのソースを見ながら必要なコントロールに命令はできます。
表示させてから以下を動作させるとソースコードが出てきます
’’ S_gamen = objIE(W).Document.body.innerHTML   'ログインできたか確認
’’ Debug.Print(S_gamen)
多分ですがこのようなことをされたい方は投資関係が多いので、、、、
この当たりが参考ではないでしょうか?
http://blog.livedoor.jp/hanagarage1963/archives/cat_33186.html?p=3

Imports System.IO
Imports System.Text
Imports System.Web
Imports System
Imports System.Net

Public IDD(20, 20) As Object
Public objIE(10) As Object
Public w As Integer

Sub IEOpen(ByVal w)

        objIE(w) = CreateObject("InternetExplorer.application")
        objIE(w).Visible = True 'IE表示
        objIE(w).width = 1200
        objIE(w).height() = 1000

    End Sub

Sub IEClose()

        For Me.w = 0 To 10
            Try
                objIE(w).Quit()
            Catch ex As Exception
                Exit For
            End Try
        Next w

    End Sub

    Sub login(ByVal objIE As Object, ByVal W As Integer, ByVal IDD As Object)

        ' loginForms
        URL01 = "hhttps://gaikaex.net/servlet/login"'HPのアドレス
        objIE(W).Navigate(URL01)
        表示待ち(objIE, W)
      
        objIE(W).document.all.P001.Value = IDD(7, 1)’P001というテキストに入れる
        objIE(W).document.all.P002.Value = IDD(7, 2)
        objIE(W).document.Forms(0).submit()’ボタンを押す

    End Sub

    Private Sub 表示待ち(ByVal objIE, ByVal w)

        Do While objIE(w).Busy
            System.Threading.Thread.Sleep(100)
            System.Windows.Forms.Application.DoEvents()
        Loop
        System.Windows.Forms.Application.DoEvents()
        '上記がないと2度目以降のクリックで下記が素素通りしてしまう
        Do While objIE(w).Document.ReadyState <> "complete"
            System.Windows.Forms.Application.DoEvents()
        Loop

    End Sub

[ツリー表示へ]
タイトルRe^7: IEの制御の方法
記事No10243
投稿日: 2010/10/04(Mon) 23:31
投稿者田淵
keisukeさん、有り難うございます。

このコード、すごい勉強になりました。

http://blog.livedoor.jp/hanagarage1963/archives/cat_33186.html?p=3
こちらも、やりたいことが載っていたので、大変助かります。


有り難うございました。

[ツリー表示へ]
タイトル★ おせっかいかも知れませんが
記事No10246
投稿日: 2010/10/05(Tue) 08:35
投稿者花ちゃん
> keisukeさん、有り難うございます。
>
> このコード、すごい勉強になりました。
>
> http://blog.livedoor.jp/hanagarage1963/archives/cat_33186.html?p=3
> こちらも、やりたいことが載っていたので、大変助かります。

VB6.0 の昔よく使われていたコードを.NET用に移植されたコードのようで、特に
表示待ち の処理等は、DocumentComplete イベント等で完全に表示された事を取得
する必要があります。(私も以前は同様の処理をしておりましたが)

VBはイベント駆動型の言語なので、ループで待機させるのではなく、Documentプロパティ
への読み込み完了なら、DocumentComplete イベントを利用するようにとあちこちの
掲示板で魔界の仮面弁士さんが解説されています。
又、Sleep や DoEvents() 等も無闇に使用すると予期せぬトラベルの元になるので
使用を控えるような書き込みが最近では多く目に付きます。
他人のコードを利用される場合は、その内容を良く理解して利用するようにされた方が
いいかと思います。

尚、VB2005 から IE 使用する場合は、COM オブジェクトを使用する事になるので
解放処理等が必要になり、その分操作が複雑(Excel の操作参照)になるので十分注意
して下さい。
>objIE(W).document.all.P001.Value = IDD(7, 1)
従って、上記のような書き方も、VB.NET では、NG です。(VB6.0 なら OK ですが)

[ツリー表示へ]
タイトルRe: ★ おせっかいかも知れませんが
記事No10249
投稿日: 2010/10/05(Tue) 18:27
投稿者keisuke
花ちゃんさん、ありがとうございます。
大変勉強になりました、表示待ちの件は、以前こちらでの書き込みを参考に
いたしております。

DocumentCompleteを調べて修正したいと思います。
ご指摘くださり感謝しております、ありがとうございます。

[ツリー表示へ]
タイトルRe^6: IEの制御の方法
記事No10241
投稿日: 2010/10/02(Sat) 22:25
投稿者花ちゃん
> エラー    1    インターフェイス 'mshtml.IHTMLElementCollection' には既定のプロパティがないため、インデックス処理を実行できません。    

失礼しました、下記に変更して見て下さい。 [ Elements(1) → Elements.item(1) ]
(VB2010 ならエラーにならないのですが)
又、今回のような場合なら直接、DocumentComplete イベント内で処理をしてもOKです。

    Private Sub foo(ByVal pDisp As Object, ByRef URL As Object)
        Dim Elements As mshtml.IHTMLElementCollection = DirectCast(DirectCast(IE.Document, _
                 mshtml.HTMLDocument).all.tags("INPUT"), mshtml.IHTMLElementCollection)
        Dim Element As mshtml.IHTMLElement = DirectCast(Elements.item(1), mshtml.IHTMLElement)
        Element.setAttribute("value", "VBレスキュー(花ちゃん)")
        Element = DirectCast(Elements.item(2), mshtml.IHTMLElement)
        Element.click()
    End Sub

[ツリー表示へ]
タイトルRe^7: IEの制御の方法
記事No10242
投稿日: 2010/10/04(Mon) 23:26
投稿者田淵
花ちゃんさん、有り難うございます。

正直、どう処理しているか、7割ほどしか理解していませんが、勉強させていただきます。

流れは
IHTMLElementCollectionで"INPUT"TAGを探し、1番目のitemの"INPUT"TAGにsetAttributeでVBレスキュー(花ちゃん)をセットしているという解釈でしょうか?

間違ってたらすみません。

有り難うございました。

[ツリー表示へ]