VBAのDOM操作でinnerHTMLが取得できないWEBシステムがあるのを解決したい。
ExcelVBAで起動中のWebシステムのHTMLを取得してテキストファイルに書き出すということをやっています。
以下のコードでうまく動いていて実績もあるのですが、ある特定のシステムで、下記の「doc.all(0).innerHTML」で取得した文字列が空になってしまいます。
もちろんWebシステムの画面には色々とレンダリングされているので、HTMLが空なはずはないと思っています。
可能性として何が考えられるか、および、どのような調査を進めるべきかについて、ご教授いただきたいです。
発生している問題・エラーメッセージ
警告やエラーは出ません。
(「doc.all(0).innerHTML」の結果が空になるだけです。)
該当のソースコード
ExcelのVBA
1Sub HTML取得() 2 Dim ie 3 Set ie = Nothing 4 Dim obj 5 For Each obj In CreateObject("Shell.Application").Windows 6 If obj.readyState = 4 Then 7 If TypeName(obj.Document) = "HTMLDocument" Then 8 Call outputHtml(obj.Document, obj.LocationName) 9 End If 10 End If 11 Next 12 Set ie = Nothing 13 MsgBox "完了。" 14End Sub 15 16Function outputHtml(doc, lname) 17 Open ThisWorkbook.Path & "\" & lname & ".html" For Output As #1 18 Print #1, doc.all(0).innerHTML 19 Close #1 20 For Each frametag In doc.getElementsByTagName("Frame") 21 Dim fc As FramesCollection 22 Set fc = doc.frames 23 Dim obj 24 Set obj = fc(frametag.Name) 25 Call outputHtml(obj.Document, lname & "_" & frametag.Name) 26 Next 27End Function
試したこと
・上記「obj.LocationName」は正しく取得できているので、対象のウインドウを誤っているということはなさそうです。
・リッチクライアントなど、HTML以外の技術を使っているのかとも思いましたが、市販のRPAソフトを使うと正しくWebシステムモードになって、DOMを認識しての記録と実行ができるので、リッチクライアントというわけでも無さそうです。
・VBAのデバッグでウォッチ式を使ってDOMの構造を見ようとしましたが、いまいち見方が分からず、HTMLの要素までたどり着けませんでした。
補足情報(FW/ツールのバージョンなど)
・対象のWEBアプリは、仕事で使っている業務アプリなので、一般的に公開されているものではありません。導入業者から、RPAソフトによる自動操作は自己責任でやってもらっていいと許可を得ているので、DOM操作が規約違反になるなどの問題がないことは確認済みです。
・環境はExcel2016、IE11です。
補足情報(2021/10/11 13:29 追記)
とりあえずの解決策はわかりました。
doc.all(0).innerHTMLではなく、
doc.all(1).innerHTMLにすれば、取得できました。
システムによって、「0」だったり「1」だったりするようですが、
https://developer.mozilla.org/ja/docs/Web/API/Document/all
には、「非推奨 HTML5」とあるので、それも関係しているのかもしれません。
all(0)で見つからなければ、all(1)を見にいけば、どちらのシステムでも対応できそうですが、どうもすっきりしない部分も残ります。
・「0」と「1」のシステムで何が違うのか?(システム側でHTML生成の何か作り方が異なっている?)
・「all()」が非推奨だとすると何を使うのがよいのか?
・システムごとの「0」か「1」を意識しなくてもOKや、きれいなコーディングはあるのか?
もし、詳しい方がいましたら、教えてもらえると助かります。
解決情報(2021/10/11 15:29 追記)
以下を使うことでうまくいきました。どうもありがとうございました。
https://developer.mozilla.org/ja/docs/Web/API/Document/documentElement
回答1件
あなたの回答
tips
プレビュー