VB.NETでフレーム内のフォームに情報を入力しボタンを押すには

解決


さと  2006-12-29 06:22:50  No: 97573

こんにちわ、はじめまして。
現在VB.NETを使用して、証券会社にログインし自動で注文させるプログラムを作成しています。

この掲示板でも以前に何度か質問されていたフレーム内のボタンをクリックというのは全て読ませていただき自分なりに勉強をしたのですが1ヶ月頑張っても先に進めなかったので恥ずかしいはなしなのですが、みなさんのお力をかりたく投稿させていただきました。

証券会社というのは楽天証券で、最初にでるログイン画面は無事に自動で入力しボタンを押すことができました。ソースです↓

Dim doc As mshtml.HTMLDocument
            doc = AxWebBrowser1.Document
                      
            doc.all.item("loginid").innertext = "ID"
            doc.all.item("passwd").value = "PASSWORD"
            doc.all.item("submit%template").click()

ログイン後会員ページが開かれるのですがそこではどうやらみっつのフレームが使われているようなのです。↓
<frame src="/bv/app/view/com/com_page_global_menu.jsp?type=home&sub_type=&local=&use_local_menu=false&BV_SessionID=@@@@0142828247.1167307967@@@@&BV_EngineID=ccceaddjkfhmkemcefeceemdgfgdfkh.0" name="topframe" noresize="noresize" scrolling="no">
<frame src="/bv/app/view/com/com_page_local_template.jsp?type=home&sub_type=&local=&use_local_menu=false&template=%2Fhome.do%3FeventType%3Dinit&BV_SessionID=@@@@0142828247.1167307967@@@@&BV_EngineID=ccceaddjkfhmkemcefeceemdgfgdfkh.0" name="middleframe" noresize="noresize" scrolling="no">

<frame src="/bv/app/view/com/com_page_footer.jsp?style=small&BV_SessionID=@@@@0142828247.1167307967@@@@&BV_EngineID=ccceaddjkfhmkemcefeceemdgfgdfkh.0" name="bottomframe" noresize="noresize" scrolling="no">

それでまず注文画面にいくために一番上のフレームの注文画面へ行くためのボタンをクリックすることもできました。↓

 Dim doc1 As mshtml.IHTMLDocument2
            doc1 = AxWebBrowser1.Document
            doc1.frames.item("topframe").document.all.item("info").click()

ですが、そのあとの証券コードを入力し、ボタンを押すという作業がどうしてもできません、いろいろと試しましたができませんでした・・。
フレームは最初の「topframe」以外の二つのどちらかと思い、二つのフレーム名をうちこんだソースを同時に実行してためしています。
そのコードを入力するテキストボックスとボタン近辺のソース↓

<form name="InfoJpPrcSearchForm" method="post" action="/bv/app/info_jp_prc_search.do?BV_SessionID=@@@@0142828247.1167307967@@@@&BV_EngineID=ccceaddjkfhmkemcefeceemdgfgdfkh.0">

<td class="mtext"><nobr>&nbsp;銘柄コード・銘柄名&nbsp;:&nbsp;</nobr></td>
    <td class="mtext"><nobr><input type="text" name="dscrCdNm" value=""></nobr></td>

<td class="mtext"><nobr>&nbsp;&nbsp;<input type="submit" value="    検  索    "></nobr></td>
    </tr>

これを先ほどの注文ページへの以降するために使用したコードをいろいろいじってやってみたのですが、全くできなくて悩んでいます。
一応一番最近に試したソースを載せておきます。

Dim doc1 As mshtml.IHTMLDocument2
            doc1 = AxWebBrowser1.Document
            doc1.frames.item("middleframe").document.GetElementsByName("dscrCdNm").InnnerText = "証券コード"

分かりにくい説明かとは思いますが、是非お力をお貸しください・・。
よろしくお願いします。


ヤマ@文系  2007-01-01 04:59:33  No: 97574

考えられそうなのを3つほど。

1.階層が深すぎて参照がうまくいってない。
doc1.frames.item("middleframe").document.GetElementsByName("dscrCdNm").InnnerText = "証券コード"
set frames=doca.frames
など細かくして参照してみるなど。

2.document.allからアクセスしてみる。
3.srcで指定されたframeページ自体をブラウザで読み込む。

簡単にログインできないのでテストはしていません。


さと  2007-01-05 11:27:53  No: 97575

ヤマさん

お返事ありがとうございます。
実はこのソースの前は細かく参照してやっていたのです。それでも無理でした・・。
document.allからもです。

srcからのログインですが、そこの部分のログインはうまくいっています。
ログイン後のページの中のテキストボックスの中への入力がうまくいかないのです・・。
正月からずっと頑張っていますが、未だに・・。
結局解決せずに年を越してしまいました。
もうちょっとがんばってみます。


VB梅  2007-01-05 20:07:17  No: 97576

さとさんへ
こんにちは
よく間違えやすいミスとして、フレームの枠が読み込まれて直ぐに処理をしていませんか?
フレーム内容が読み込まれるまで待機しておく必要があります。

待機方法のサンプルとしてソースをあげておきますね
(ま、この場合フレームの内容が読み込まれていないとエラーで直ぐわかるのですが^^;)
====================================================================================
  Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Integer)
  Private objDocument As mshtml.HTMLDocument
  Private objinput1 As Object
  Private objinput2 As Object
  Private objinput3 As Object

Sub Main()
  WebBrowser.Navigate("http://test/test.htm")
  Do While WebBrowser.ReadyState <> SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE
    System.Windows.Forms.Application.DoEvents()
    Sleep(1)
  Loop
  objDocument = WebBrowser.Document
  objinput1 = objDocument.frames.item(1).Document
  objinput2 = objDocument.frames.item(2).Document
  objinput3 = objDocument.frames.item(3).Document
  Call ObjRead(objinput1)
  Call ObjRead(objinput2)
  Call ObjRead(objinput3)
  'この後に処理する。

End sub

Sub ObjRead(ByVal ObjReadyState As Object)
  Do While ObjReadyState.ReadyState <> "complete"
    System.Windows.Forms.Application.DoEvents()
    Sleep(1)
  Loop
End Sub
========================================================================
また、証券会社のページはフレームのまたフレームと言うようにフレームを多段にしている場合があります。
InnnerTextでhtmlソースをじっくり確認したほういいです。
大和証券がその例でした
  objDocument = WebBrowser.Document
  objinput2 = objDocument.frames.item(2).Document
  objinput3 = objinput2.frames.item(1).Document
のような感じです。


さと  2007-01-08 06:44:52  No: 97577

VB梅さん

フレームの読み込み待ちに関しては問題ないと思われます。
フレームの多段については考えてませんでした!
全く予想もしていなかったです・・。
まだ試していないのですが、先にお礼を・・・。
これから試してみます。どうもありがとうございました^^


さと  2007-01-08 12:25:27  No: 97578

フレームはやはり多重になっているようです。
topframeの中にbuttomframeとmiddleframeが入っているようでした。
それで問題の入力フォームが入っているのがmiddleframeでした。
そこまでは分かったのですが、なかなか先にすすめません。

Dim doc1 As mshtml.IHTMLDocument2
        doc1 = AxWebBrowser1.Document
       
        Dim frame As mshtml.IHTMLWindow2
        frame = doc1.frames.item("topframe")
        Dim frame1 As mshtml.IHTMLWindow2
        frame1 = doc1.frames.item("middleframe")
までは教えていただいたようにやってみたのですが、その後がちょっと分かりません・・。いろいろと試してみました。
frame.frame1.GetElementsByName("テキストボックスの名前").value = "コード"
   など。
初歩的なことかもしれませんが、もしよろしければアドバイスなどいただければうれしいです。


VB梅  2007-01-09 20:16:42  No: 97579

こんにちわ
さとさんへ
Dim doc1 As mshtml.IHTMLDocument2
doc1 = AxWebBrowser1.Document      
Dim frame As mshtml.IHTMLWindow2
frame = doc1.frames.item("topframe").Document
Dim frame1 As mshtml.IHTMLWindow2
frame1 = frame.frames.item("middleframe").Document
frame1.GetElementsByName("テキストボックスの名前").value = "コード"
このような感じじゃないかな〜
ご確認してください


さと  2007-01-10 00:52:24  No: 97580

VB梅さんまたまたお返事ありがとうございます。

Dim doc1 As mshtml.IHTMLDocument2
doc1 = AxWebBrowser1.Document      
Dim frame As mshtml.IHTMLWindow2
frame = doc1.frames.item("topframe").Document←①ここで
Dim frame1 As mshtml.IHTMLWindow2
frame1 = frame.frames.item("middleframe").Document←②
frame1.GetElementsByName("テキストボックスの名前").value = "コード"

①で型 'mshtml.HTMLDocumentClass' の COM オブジェクトをインターフェイス型 'mshtml.IHTMLWindow2' にキャストできません。IID '{332C4427-26CB-11D0-B483-00C04FD90119}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
というエラーがでてしまいます。
.Documentの部分を消すとそこは通るのですが、②の部分でも同じエラーが出て、.Documentを消すと  メンバが見つかりません。 (HRESULT からの例外: 0x80020003 (DISP_E_MEMBERNOTFOUND))というエラーがでました・・。
もうちょっとがんばってみます^^


さと  2007-01-10 13:02:53  No: 97581

ヤマさん、VB梅さん。
本当に申し訳ない。こちらからの情報が間違っていました・・。
VB梅さんのおっしゃるとおりフレームは多重になっていることは間違いなかったのですが、目的のものがあるフレーム名が間違ってました。
先ほどもう一度いろいろと調べ直しているうちに判明しました。
うまくいったコードです↓

Dim doc1 As mshtml.IHTMLDocument2
doc1 = AxWebBrowser1.Document
        doc1.frames.item("middleframe").frames.item("rightframe").document.all.item("dscrCdNm").value = "証券コード"

        doc1.frames.item("middleframe").frames.item("rightframe").document.forms.item("InfoJpPrcSearchForm").submit()

かなり強引な書き方ですが、うまくいきました。
アドバイスありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加