アプリ版:「スタンプのみでお礼する」機能のリリースについて

ホームページの構成、通信状況によって要素を取得できずエラーになる場合があります。
対策をとったのですが、それでもたまにエラーとなるためご助言を頂きたいです。

とった対策は、要素取得前に objIE.document.all(0).OuterHTML に特定の文字があれば要素を取得するというようにしました。しかし、objIE.document.all(0).OuterHTML自体を取得できずにエラーとなる場合があります。その際は、そのまま実行するとそのままエラーなく通過しその後の要素を取得できます。

このたまにでるエラーを回避したいです。
ちなみに、IEのBusy待ち等の基本的なのは全て入れているつもりです。
またsleepを可能な限り入れればよいのですが、速さを求めているためsleepは基本使わない対策とりたいです。

objIe.document.all(0).outerhtmlよりもっと確実に取得できる術はないでしょうか?
ちなみにwhileでループさせて、文字列の有無をチェックしています。たとえ、IEが全てをロードできてないにしても、何か文字列のカケラでもエラーなく取得したいです。
(本音は、Busy待ちいれているのでそうなってほしくないのですが)

A 回答 (1件)

こんばんは。



>通信状況によって要素を取得できずエラー
Error コードは出ているはずですから、エラーのとり方はご存知だとは思いますが。

objIE.document.all(0).OuterHTML

もし、そこで失敗を認知しているとしたら、私が経験するのは、LocationURL とかの、希望のURLが取れていない可能性があります。(現実に、それで私は対処しています。しかし、サイトのエラーの時、エラーページに飛ぶので、その時は、Busy は利きません。タイムラグが必要です。)

例:私の場合

Const KEYWORD = "oshiete"
With ObjIE
If InStr(1, .LocationURL, KEYWORD, vbTextCompare) = 0 Then
   MsgBox "did not reach the destination", 48
   GoTo EndLine
End If
End With

もちろん、下記の方法もありかもしれませんが。

Do
OHT =objIE.document.all(0).OuterHTML
Len(OHT) >10 Then Exit Do
Loop While objIE.Busy Or objIE.ReadyState <> 4

または、document.all.length >0 で見分けます。

よほど単純なサイトでないと、document.all は使いません。
With ObjIE
.document.getElementsByTagName("a")
.document.getElementsByClassName("q_text")

>速さを求めているためsleepは基本使わない対策とりたいです。
Win API のSleep は遅くはありません。しかし、私が使わない理由は、使ってもオブジェクトなどのデータが得られるか確実性がないからです。取れない時は、もう取れないとして、一旦離脱するのがよいと思います。

速さだけだったら、ご存知でしょうけれども、DOMもあります。
Dim objHTTP As WinHttpRequest
objHTTP.Open "GET", strURL, False
objHTTP.Send

とすればよいのですが、動的なサイトや認証のあるところでは、極めて成功率が低いのです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!