WebBrowser でリンクをクリックするには?

解決


まりの  2005-11-29 06:16:08  No: 92976

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だと何か不都合なことがあるのでしょうか?
よろしくお願いします。


魔界の仮面弁士  2005-11-29 07:46:37  No: 92977

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


ヤマ@文系  2005-11-30 11:41:54  No: 92978

もしかしたらiframe(インラインフレーム)内のをクリックしたいのではないでしょうか・・・?
  DHTMLでアクセスはできないので(セキュリティ上の問題らしいです)、
iframeのサイト自体を再度読み込ませる必要があると思いますよ。
具体的なコードは書きませんが。


まりの  2005-12-01 04:54:55  No: 92979

魔界の仮面弁士さん、早速回答いただきありがとうございます。
いただいたコードを、こちらの環境で別途試したところ正常に動作しました。
その後、こちらのクリックできないコードを、いただいたコードに変えて実行したところ、クリックできる場合もありますが、依然としてできない場合もあります。
その原因ですが、どうやら、イベントの発生タイミングにあるようです。
こちらでは、クリックをAxWebBrowser1_DocumentCompleteのタイミングでやるようにしているんですが、このイベントは、マルチフレームのページを読むときは、それぞれのフレームがダウンロードされるときにそれぞれ発生するようです。そのイベントでは、同じ処理が2度実行されないように制御していたので、クリックされないことがあるのも当然ですね。
すいません、この辺の事情を省略してしまって。

魔界の仮面弁士さんには、お手数をおかけしました。
また、コレに関して、あらたな質問があるのですが、新しい投稿でさせていただきます。これもよろしくお願いいたします。


まりの  2005-12-01 05:02:37  No: 92980

ヤマ@文系さん、回答ありがとうございました。
自分がアクセスしようとするページのソースには、framesetやframeなどの見慣れたタグしかなく、iframeなのかどうかわかりませんが、ちょっと確認してみます。


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

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






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