VB.NETでWebBrowserを用い、マルチフレームのなかの1つのフレームについて、リンクのNAMEやinnerTextの内容を判断し、必要に応じてそのリンクをクリックするような処理を考えています。
Dim doc As mshtml.HTMLDocument
doc = AxWebBrowser1.Document.frames("frame1").Document
TextBox5.Text = doc.links.length
TextBox4.Text = doc.links.item(0).name
TextBox6.Text = doc.links.item(0).innertext()
たとえば、リンクの総数や、最初のリンクのNAME、innerTextは、こうして得ることができました。
このitem(0)のリンクをクリックしたいのですが、
doc.links.item(0).click
のような指定では反応がありません。(そもそも、こんな指定でいいのかどうかもわかりませんが...)
どうしたらよいのでしょうか?教えてください。
また、クリック対象のリンクは、
<A NAME ="link1" HREF="JavaScript:List(0)"><!-- case 0 -->text 1</A>
といった記載になっています。リンク先がJavaScriptだと何か不都合なことがあるのでしょうか?
よろしくお願いします。
VB2005 の System.Windows.Forms.WebBrowser クラスではなく、
VB.NET 2002/2003 から、ActiveX の WebBrowser を扱っているのですね。
> リンク先がJavaScriptだと何か不都合なことがあるのでしょうか?
同様の構成のWebサイトを探してきて、VB.NET 2003 にて試してみましたが、
当方では、問題なくクリック処理が行われました。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AxWebBrowser1.Navigate("http://technique.eweb-design.com/sample/6_2_frame.html")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim doc1 As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser1.Document, mshtml.IHTMLDocument2)
Dim f As mshtml.FramesCollection = doc1.frames
Dim w As mshtml.IHTMLWindow2 = DirectCast(f.item(1), mshtml.IHTMLWindow2)
Dim doc2 As mshtml.IHTMLDocument2 = w.document
Dim l As mshtml.IHTMLElementCollection = doc2.links
Dim A As mshtml.IHTMLElement = DirectCast(l.item(0), mshtml.IHTMLElement)
A.click()
System.Runtime.InteropServices.Marshal.ReleaseComObject(A)
System.Runtime.InteropServices.Marshal.ReleaseComObject(l)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(w)
System.Runtime.InteropServices.Marshal.ReleaseComObject(f)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc1)
End Sub
もしかしたらiframe(インラインフレーム)内のをクリックしたいのではないでしょうか・・・?
DHTMLでアクセスはできないので(セキュリティ上の問題らしいです)、
iframeのサイト自体を再度読み込ませる必要があると思いますよ。
具体的なコードは書きませんが。
魔界の仮面弁士さん、早速回答いただきありがとうございます。
いただいたコードを、こちらの環境で別途試したところ正常に動作しました。
その後、こちらのクリックできないコードを、いただいたコードに変えて実行したところ、クリックできる場合もありますが、依然としてできない場合もあります。
その原因ですが、どうやら、イベントの発生タイミングにあるようです。
こちらでは、クリックをAxWebBrowser1_DocumentCompleteのタイミングでやるようにしているんですが、このイベントは、マルチフレームのページを読むときは、それぞれのフレームがダウンロードされるときにそれぞれ発生するようです。そのイベントでは、同じ処理が2度実行されないように制御していたので、クリックされないことがあるのも当然ですね。
すいません、この辺の事情を省略してしまって。
魔界の仮面弁士さんには、お手数をおかけしました。
また、コレに関して、あらたな質問があるのですが、新しい投稿でさせていただきます。これもよろしくお願いいたします。
ヤマ@文系さん、回答ありがとうございました。
自分がアクセスしようとするページのソースには、framesetやframeなどの見慣れたタグしかなく、iframeなのかどうかわかりませんが、ちょっと確認してみます。
ツイート | ![]() |