fc2ブログ

HTML要素とフレームを操作する

IEが開けるようになったら、今度は、開いたページのフレームや要素にアクセスにして、値を取得できるようにしてみましょう。例えば、フレームを利用したページがあり、まず上下に分割、下側が左右に分割されているとします。そして、下側の右ページのテーブルの中に文字列が配置されており、この文字列を読み取ることを考えてみます。
スポンサーリンク
そのためには、まず、フレームの下側→右側とたどります。続いて、フレーム内のHTMLタグを読んで、html → body → table → tr → tdとHTML要素たどっていく必要があります。
ここでは、「現在参照しているフレーム」と「現在参照しているHTML要素」をIEWrapperクラスに保持することにします。ソースコードは以下の通りです。Internet Explorer(IE)を起動するで書いたIEWrapperクラスのIEプロパティSetterとGotoUrlメソッドにも変更があります。

Protected Property IE As SHDocVw.InternetExplorer
Get
Return _ie
End Get
Set(ByVal value As SHDocVw.InternetExplorer)
_ie = value
RootFrame()
End Set
End Property

' URL移動
Sub GotoUrl(ByVal url As String, Optional ByVal timeout As TimeSpan = Nothing)
IE.Navigate(url)
WaitIE(timeout)
RootFrame().RootDocument().RootElement()
End Sub

Private _currentFrame 'これだけはどうしても遅延バインディング Option Strict Onにはできない
Protected Property CurrentFrame
Get
Return _currentFrame
End Get
Set(ByVal value)
_currentFrame = value
If Not _currentFrame Is Nothing And IE.Visible Then
RootDocument()
Else
CurrentDoc = Nothing
End If
End Set
End Property

Private _currentDoc As MSHTML.IHTMLDocument3
Protected Property CurrentDoc As MSHTML.IHTMLDocument3
Get
Return _currentDoc
End Get
Set(ByVal value As MSHTML.IHTMLDocument3)
_currentDoc = value
If Not _currentDoc Is Nothing Then
RootElement()
Else
_currentElement = Nothing
End If
End Set
End Property

Protected _currentElement As MSHTML.IHTMLElement2

Function RootFrame() As IEWrapper
CurrentFrame = IE
Return Me
End Function

Function RootDocument() As IEWrapper
CurrentDoc = CurrentFrame.Document
Return Me
End Function

Function RootElement() As IEWrapper
_currentElement = DirectCast(_currentDoc.documentElement, MSHTML.IHTMLElement2)
Return Me
End Function

' フレーム
Function Frame(ByVal name As String) As IEWrapper
Dim fs = CurrentDoc.frames

For i As Integer = 0 To fs.length - 1
Dim f1 As Object = fs.item(DirectCast(i, Object))
If f1.name = name Then
CurrentFrame = f1
Return Me
End If
Next i
Throw New ArgumentException(String.Format("指定されたnameのframeは見つかりません。name={0}", name))
End Function

Function Element(ByVal tagName As String, ByVal indexNum As Integer) As IEWrapper
_currentElement = DirectCast(Element(tagName)(indexNum), MSHTML.IHTMLElement2)
Return Me
End Function

Function Element(ByVal tagName As String) As MSHTML.IHTMLElementCollection
Return _currentElement.getElementsByTagName(tagName)
End Function

Function ParentElement() As IEWrapper
_currentElement = DirectCast(DirectCast(_currentElement, MSHTML.IHTMLElement).parentElement, MSHTML.IHTMLElement2)
Return Me
End Function

Function IsNothingElement() As Boolean
If _currentElement Is Nothing Then
Return True
Else
Return False
End If
End Function
例えば、先ほどの例(フレームの名前が、bottom、rightだとします)で、テーブルの3行目5列目の文字列にたどりつくには、以下のようなコードにします。

Dim ie As New IEWrapper()
ie.NewIE("http://XXX.XXX.XXX/")
ie.Frame("bottom").Frame("right")
ie.Element("html", 0).Element("body", 0).Element("table", 0).Element("tr", 2).Element("td", 4)
続いてテーブルの4行目3列目を参照するには、以下のようRootElementメソッドを呼び出してからElementメソッドを呼びます。参照している位置をRootXxxxでリセットし、ルート(根っこ)に戻るのです。参照する位置が変わるときは、RootXxxxを呼ぶ必要がありますので、忘れないようにしてください。

ie.RootElement().Element("html", 0).Element("body", 0).Element("table", 0).Element("tr", 3).Element("td", 2)
左側のフレームを参照するには、以下のようRootFrameメソッドを呼び出してからFrameメソッドを呼びます。

ie.RootFrame().Frame("bottom").Frame("left")
ここまでで、目標とする値までたどることができるようになりました。
スポンサーリンク
<<3D球体タグクラウド | ホーム | 自動売買で本当に儲かるのか?>>
コメント(0)
コメントの投稿
トラックバック(0)