fc2ブログ

ログインセッションの基本クラス

ログイン後のトップ画面以降は、フレームで構成されています。まず上下(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
FocusXxxxFrameは各フレームにアクセスするためのメソッドです。

GoXxxxメソッドは、画面遷移のためのメソッドでGotoTabメソッドを呼び出しています。GotoTabメソッドでは、引数にbaseClassを指定していますが、これは、同一タブをクリックする処理のときに、一度、別のタブをクリックしてから戻ってくるようにするためのものです。また、このメソッドでは、topframeフレーム→table要素→img要素とだどって、リンクをクリックしていることが分かります。GoNextCommonメソッドは、HTMLを解析し、a要素を順にたどり、「次へ」という値が見つかったらクリックしています。

DispatchExceptionメソッドは、例外処理を共通化したメソッドです。発生した例外の種類ごとに処理が分かれています。通常の例外では、同じIEでログイン画面に戻る処理を行っています。しかし、TimeoutExceptionが発生した場合は、IE自体がフリーズしている可能性があります。そのため、新しくIEを開きなおす(新しいプロセスでIEを起動する)という処理を行っています。
スポンサーリンク
<<楽天証券のWeb画面の基本クラス | ホーム | 注文タブの基本クラス>>
コメント(0)
コメントの投稿
トラックバック(0)