こんにちわ、はじめまして。
現在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> 銘柄コード・銘柄名 : </nobr></td>
<td class="mtext"><nobr><input type="text" name="dscrCdNm" value=""></nobr></td>
<td class="mtext"><nobr> <input type="submit" value=" 検 索 "></nobr></td>
</tr>
これを先ほどの注文ページへの以降するために使用したコードをいろいろいじってやってみたのですが、全くできなくて悩んでいます。
一応一番最近に試したソースを載せておきます。
Dim doc1 As mshtml.IHTMLDocument2
doc1 = AxWebBrowser1.Document
doc1.frames.item("middleframe").document.GetElementsByName("dscrCdNm").InnnerText = "証券コード"
分かりにくい説明かとは思いますが、是非お力をお貸しください・・。
よろしくお願いします。
考えられそうなのを3つほど。
1.階層が深すぎて参照がうまくいってない。
doc1.frames.item("middleframe").document.GetElementsByName("dscrCdNm").InnnerText = "証券コード"
set frames=doca.frames
など細かくして参照してみるなど。
2.document.allからアクセスしてみる。
3.srcで指定されたframeページ自体をブラウザで読み込む。
簡単にログインできないのでテストはしていません。
ヤマさん
お返事ありがとうございます。
実はこのソースの前は細かく参照してやっていたのです。それでも無理でした・・。
document.allからもです。
srcからのログインですが、そこの部分のログインはうまくいっています。
ログイン後のページの中のテキストボックスの中への入力がうまくいかないのです・・。
正月からずっと頑張っていますが、未だに・・。
結局解決せずに年を越してしまいました。
もうちょっとがんばってみます。
さとさんへ
こんにちは
よく間違えやすいミスとして、フレームの枠が読み込まれて直ぐに処理をしていませんか?
フレーム内容が読み込まれるまで待機しておく必要があります。
待機方法のサンプルとしてソースをあげておきますね
(ま、この場合フレームの内容が読み込まれていないとエラーで直ぐわかるのですが^^;)
====================================================================================
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
のような感じです。
VB梅さん
フレームの読み込み待ちに関しては問題ないと思われます。
フレームの多段については考えてませんでした!
全く予想もしていなかったです・・。
まだ試していないのですが、先にお礼を・・・。
これから試してみます。どうもありがとうございました^^
フレームはやはり多重になっているようです。
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 = "コード"
など。
初歩的なことかもしれませんが、もしよろしければアドバイスなどいただければうれしいです。
こんにちわ
さとさんへ
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 = "コード"
このような感じじゃないかな〜
ご確認してください
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))というエラーがでました・・。
もうちょっとがんばってみます^^
ヤマさん、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()
かなり強引な書き方ですが、うまくいきました。
アドバイスありがとうございました!
ツイート | ![]() |