#概要
POWERSHELLを使って、IEを操作しファイルDLをしていたのですが、WINDOWS7からWINDOWS10にアップデートした際に、動作しなくなったため対応方法の覚書です。
https://qiita.com/kk-ster/items/259ad6c9921242a86731
の続きの記事です。
以前の記事を書いたあと、別スクリプトで発生した問題を追加で記事を作成しました。
特定のサイトでDOM要素が取得できない
タイトルの通りです。
問題のサイトは古くからあるWEBサービスの管理者サイトなのですが
WINDOWS10にVerUP後、InternetExplorer.Applicationからの
DOM操作がいうことを聞かなくなりました。
ieオブジェクトの中身は正常にセットされているのですが
ieオブジェクトのDocumentから操作しようとしても
エラーが発生するようになってしまいました。
例えば要素に対してクリックを実行しようとした場合
[System.__ComObject] に 'click' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
とエラーが発生してしまいます。
発生パターンの検証はできていませんが、対象のサイトはクライアント証明書が
必要なサイトであるため、関係があるかもしれません。(未検証)
###対応
操作したいサイトに対して互換表示設定を実施した。
〇操作方法
操作したいサイトを開いた状態で、
ツール➡互換表示設定
をひらいてください。
「追加するWEBサイト」の項目に開いているサイトがはいっているため追加を押下してください。
私の環境では、これで、DOM操作ができるようになりました。
navigate()でURLを開いたものに対して、DOMで要素が取得できない
こちらも、すべてのサイトで発生するわけではないのですが、navigate()で画面表示したあと
IEオブジェクトからDOM操作ができなくなる現象が発生するようになりました。
以下、DOM操作のサンプル(URLを開きNameがLINKのタグをクリック)
# IEオブジェクトを取得
objShell=new-object -com Shell.Application
$ie=new-object -com InternetExplorer.Application
$ie.navigate("開きたいURL")
# IEオブジェクトからdocument取得
$doc = $ie.document
# documentからDOM操作
$pass = $doc.getElementsByName("LINK")
# 要素が複数取得されているため、1個目をクリック
@($pass)[0].click()
処理させると、docからDOM操作して取得できるはずの情報が取得できず、エラーが発生します。
このとき$ieの中身を確認するとSystem.__ComObjectと返ってきます。
ieオブジェクトの確認
$ie
結果
System.__ComObject
本来であれば、下で示すようにURL情報等細かい情報表示ができるはずなのですが
情報が取得ができていないため、DOM操作ができなくなっていると思われます。
成功例:
Application : System.__ComObject
Parent : System.__ComObject
Container :
Document : mshtml.HTMLDocumentClass
TopLevelContainer : True
Type : HTML ドキュメント
Left : 592
Top : 28
Width : 1226
Height : 1011
LocationName : 「サイトのタイトル」
LocationURL : 「サイトのURL」
Busy : False
Name : Internet Explorer
HWND : 2295408
FullName : C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE
Path : C:\Program Files (x86)\Internet Explorer\
Visible : True
StatusBar : True
StatusText :
ToolBar : 1
MenuBar : True
FullScreen : False
ReadyState : 4
Offline : False
Silent : False
RegisterAsBrowser : False
RegisterAsDropTarget : True
TheaterMode : False
AddressBar : True
Resizable : True
###対応
表示中のブラウザ(IE)からオブジェクトを取得しなおした。
navigate()を実行したあとに、objshellからieを再取得することで
正常にDOM操作できるようになりました。
以下再取得サンプル
$ie = $objShell.Windows() |
? {$_.Name -eq "Internet Explorer"} |
Select-Object -First 1
この処理を実行した後で$ieの内容を表示すると、細かい情報が表示されるようになり
DOMでの取得、操作ができるようになりました。
#最後に
IE操作についてWIN7ではすんなり動いていた処理がWIN10になると遅くなったり安定しなくなったように感じます。
POWERSHELLでIE操作処理はインストール不要だったので重宝しているのですが
代替も考えないといけないかもしれません。