初めてのIE操作(6)~InternetExplorerオブジェクトのDocumentプロパティを調べるFunction

InternetExplorerオブジェクトのDocumentプロパティの返り値を確認するFunction

前回

akashi-keirin.hatenablog.com

「問題点」の項にも書いたとおり、VBAからIEを操ったときに、画面に表示されているHTMLドキュメントと、InternetExplorerオブジェクトのDocumentプロパティが返すHTMLDocumentオブジェクトの内容が異なる、というわけのわからない現象がたまに起きる。

ということは、InternetExplorerオブジェクトがどのような状態にあるのかを確認する工程が必要だと言うことになる。

HTMLDocumentオブジェクトのTitleプロパティを調べるFunction

簡単なFunctionを作る。

リスト1 標準モジュール
Public Function isTargetPage(ByVal targetDocument As HTMLDocument, _
                             ByVal pageTitleKeyWord) As Boolean
  isTargetPage = True
  If InStr(1, targetDocument.Title, pageTitleKeyWord) > 0 _
    Then Exit Function
  isTargetPage = False
End Function

アホみたいに簡単なコード。

引数としてHTMLDocumentオブジェクト(InternetExplorerオブジェクトのDocumentプロパティの返り値)と、タイトルのキーワード文字列を受け取って、Instr関数によってHTMLDocument.Titleプロパティを調べているだけ。

使ってみる

次のようなコードで実験。

スト2 標準モジュール
Public Sub testIsTargetPage()
  Dim targetIE As New InternetExplorer
  With targetIE
    .Visible = True
    Call .Navigate("http://akashi-keirin.hatenablog.com/entry/2018/12/16/001606")
    Do While .Busy Or _
             .ReadyState <> READYSTATE_COMPLETE
      DoEvents
    Loop
  End With
  Dim targetTextBox As Object
  Set targetTextBox = getElementByTagAndKeyWord(targetIE, "input", "name=""q""")
  targetTextBox.Value = "ち~んw"
  Dim targetButton As Object
  Set targetButton = getElementByTagAndKeyWord(targetIE, "input", "value=""検索""")
  targetButton.Click
  Debug.Print isTargetPage(targetIE.Document, "ち~んw")    '……(*)'
  Debug.Print targetIE.Document.Title
End Sub

実行時は、(*)の行にブレークポイントを設定して、ページ移動を待つことにする。

IEが起動し、検索ボックスに「ち~んw」が書き込まれ、ページが移動する。

十分に待って、完全にページが表示されたとおぼしき

f:id:akashi_keirin:20181229175035j:plain

この状態で満を持してコードの実行を再開。

f:id:akashi_keirin:20181229175053j:plain

ガックリ。

おわりに

実は、毎回このようになるわけではなく、ちゃんと移動後のページが取得できている場合もあるから悩ましい。

たとえば、上掲コードの(*)の前に

Call WindowsAPI.waitFor(20000)

を入れて、Clickメソッド実行後に20秒(!)待機させるようにして5回実験すると、2回成功、3回失敗、という何とも不安定な結果だった。

やっぱりわけがわからないなあ。

参考

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com