ログイン後のトップ画面以降は、フレームで構成されています。まず上下(topframe、middleframe)に分割され、下のフレームが左右(leftframe、rightframe)に分割されています。フレームのHTMLソース(一部を抜粋)は以下のようになっています。
<html>
<head></head>
<frameset rows="144,*">
<frame src="xxx" name="topframe">
<frame src="xxx" name="middleframe">
</frameset>
</html>
<html>
<head></head>
<body>
<table></table>
<table>
<table>
<table></table>
</table>
</table>
<table><tr><td>
<table>
<tr>
<td><img src="xxx" alt=""></td>
<td><img src="xxx" alt="ホーム"></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="資産状況"></a></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="注文"></a></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="投資情報"></a></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="ヴィレッジ"></a></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="口座情報"></a></td>
<td><img src="xxx" alt=""></td>
<td><a href="xxx"><img src="xxx" alt="ポートフォリオ"></a></td>
<td><img src="xxx" alt=""></td>
</tr></table>
</td><td></td><td></td></tr>
</table>
<table>
<table></table>
</table>
<table></table>
</body>
</html>
<html>
<head></head>
<frameset cols="170,*">
<frame src="xxx" name="leftframe">
<frame src="xxx" name="rightframe">
</frameset>
</html>
Public MustInherit Class AbstructRakutenWebLoginSession
Inherits AbstructRakutenWebScreen
Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Protected Sub New()
End Sub
Protected Sub New(ByVal screen As AbstructWebScreen)
MyBase.new(screen)
End Sub
Protected Enum RakutenWebTab
Home = 1
Asset
Order
Info
Village
End Enum
'タブクリック(1:ホーム,2:資産状況,3:注文,4:投資情報,5:ヴィレッジ,6:口座情報,7:ポートフォリオ)
Protected Function GotoTab(ByVal tabNum As RakutenWebTab, ByVal baseClass As Type) As AbstructRakutenWebLoginSession
If Not baseClass Is Nothing AndAlso baseClass = Me.GetType() Then
GotoTab(RakutenWebTab.Village, Nothing)
End If
Dim isSuccess As Boolean = False
Do Until isSuccess
Try
FocusHeadFrame().Element("table", 5).Element("img", (tabNum * 2 - 1)).Click()
If tabNum = RakutenWebTab.Order OrElse tabNum = RakutenWebTab.Info Then
' 日本株式以外が選択されていたら、クリックする
FocusHeadFrame().RootDocument().Element("table", 7).Element("img", 0).Click()
End If
isSuccess = True
Catch e As Exception
DispatchException(e, "タブクリック遷移")
End Try
Loop
Return Me
End Function
Protected Sub DispatchException(ByVal ex As Exception, ByVal processName As String)
Dim login As RakutenLogin = Nothing
Dim webex As WebScreenException = Nothing
Try
log.Warn(processName & "で例外が発生しました。", ex)
Throw ex
Catch e As TimeoutException
log.Error(processName & "でタイムアウトが発生しました。新しくIEを開きなおし、トップページからログインしなおします。")
login = DirectCast(RakutenLogin.Open(), RakutenLogin)
webex = New WebScreenException(e)
Catch e As Exception
log.Warn(processName & "に失敗しました。トップページからログインしなおします。")
login = DirectCast(RakutenLogin.Open(Me), RakutenLogin)
webex = New WebScreenException(e)
End Try
Dim top As RakutenTop = DirectCast(login.Login(), RakutenTop)
_ie = top._ie
Throw webex
End Sub
Function GoTop() As RakutenTop
GotoTab(RakutenWebTab.Home, Nothing)
Return New RakutenTop(Me)
End Function
Function GoAsset() As AssetList
GotoTab(RakutenWebTab.Asset, GetType(AbstructAssetFrame))
Return New AssetList(Me)
End Function
Function GoOrderSearch() As LongBuySearch
GotoTab(RakutenWebTab.Order, GetType(AbstructOrderFrame))
Return New LongBuySearch(Me)
End Function
Protected Function GoNextCommon() As AbstructRakutenWebLoginSession
For i = 0 To _ie.RootElement().Element("a").length - 1
_ie.RootElement().Element("a", i)
Dim sstr As String = _ie.InnerText
If Not sstr Is Nothing AndAlso sstr.Substring(0, 2) = "次の" Then
_ie.Click()
Return Me
End If
Next
Return Nothing
End Function
Protected Function FocusMainFrame() As IEWrapper
_ie.RootFrame().Frame("middleframe").Frame("rightframe")
Return _ie
End Function
Protected Function FocusMenuFrame() As IEWrapper
_ie.RootFrame().Frame("middleframe").Frame("leftframe")
Return _ie
End Function
Protected Function FocusHeadFrame() As IEWrapper
_ie.RootFrame().Frame("topframe")
Return _ie
End Function
End Class
GoXxxxメソッドは、画面遷移のためのメソッドでGotoTabメソッドを呼び出しています。GotoTabメソッドでは、引数にbaseClassを指定していますが、これは、同一タブをクリックする処理のときに、一度、別のタブをクリックしてから戻ってくるようにするためのものです。また、このメソッドでは、topframeフレーム→table要素→img要素とだどって、リンクをクリックしていることが分かります。GoNextCommonメソッドは、HTMLを解析し、a要素を順にたどり、「次へ」という値が見つかったらクリックしています。
DispatchExceptionメソッドは、例外処理を共通化したメソッドです。発生した例外の種類ごとに処理が分かれています。通常の例外では、同じIEでログイン画面に戻る処理を行っています。しかし、TimeoutExceptionが発生した場合は、IE自体がフリーズしている可能性があります。そのため、新しくIEを開きなおす(新しいプロセスでIEを起動する)という処理を行っています。
スポンサーリンク