Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
inspectで見えるのにUIAutomationで捕捉できないオブジェクト
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30830#CommentId85570
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2023/1/1 16:05:32
明けましておめでとうございます。
今まで UIAutomation に触れる機会が殆ど無かったので、年越しで
UIAutomation と戯れて、いろいろなブラウザーのリロード処理を作っていました。
https://gist.github.com/Benshi/514f1873f1c61280b25f1fe85d935dfc
IE/Edge/Chrome/FireFox 対応、シークレットモードの有無や IEMode かどうかの判定も搭載。
VBA ではなく VB.NET ですけれどね。
ーー
①タブブラウザのタブを分離・結合すると、以前にそのブラウザーで取得済みの
IUIAutomationElement は切断状態になり、使えなくなる模様
→ Inspect においても、自作プログラムにおいても同じ状況になった
改めてルートから再取得して、最新の階層を得れば再操作できる
→ オブジェクトが使えなくなった(切断状態となった)ことを知る方法があるのかは不明
②IE11 の場合、最小化していると、最小限の階層にしかアクセスできなくなるらしい
Inspect から見た場合も自作アプリから見た場合も、同じ結果となった
⊟"{ブラウザのタイトルバー}" ウィンドウ (ControlType=Window, ClassName="IEFrame")
┣⊟"" ウィンドウ(ControlType=Pane, ClassName="CommandBarClass")
┗⊟(null) タイトルバー(ControlType=Pane, AutomationId="TitleBar")
┣⊟"システム" メニューバー(ControlType=Button, AutomationId="Close")
┃ ┗⊡"システム" メニュー項目(ControlType=MenuItem)
┣⊡"元のサイズに戻す" ボタン(ControlType=Button, AutomationId="Minimize-Restore")
┣⊡"最大化" ボタン(ControlType=Button, AutomationId="Maximize-Restore")
┗⊡"閉じる" ボタン(ControlType=Button, AutomationId="Close")
→ ところが、その IE をアクティブにした後で Inspect を Refresh すると、階層が急に増える
(IE 以外のアプリでも、類似の事象が発生)
⊟"{ブラウザのタイトルバー}" ウィンドウ (ControlType=Window, ClassName="IEFrame")
┣⊟"" ウィンドウ(ControlType=Pane, ClassName="Client Caption")
┣⊟"ナビゲーション バー" ウィンドウ(ControlType=Pane, ClassName="WorkerW")
┃ ┗⊟"" ウィンドウ(ControlType=Pane, ClassName="ReBarWindow32")
┃ ┣⊞"" ウィンドウ(ControlType=Pane, ClassName="CommandBarClass")
┃ ┣⊟"アドレス バー" ウィンドウ(ControlType=Pane, ClassName="Address Band Root")
┃ ┃ ┣⊞"" ウィンドウ(ControlType=Pane, ClassName="AddressDisplay Control")
┃ ┃ ┣⊡"" 編集(ControlType=Edit, ClassName="Edit")
┃ ┃ ┣⊞"アドレス コンボ コントロール" ツール バー(ControlType=ToolBar, ClassName="ToolbarWindow32")
┃ ┃ ┗⊞"ページ コントロール" ツール バー(ControlType=ToolBar, ClassName="ToolbarWindow32")
┃ ┣⊞"検索バー" ウィンドウ(ControlType=Pane, ClassName="Address Band Root")
┃ ┃ ┣⊡"" 編集(ControlType=Edit, ClassName="Edit")
┃ ┃ ┗⊞"アドレス コンボ コントロール" ツール バー(ControlType=ToolBar, ClassName="ToolbarWindow32")
┃ ┣⊞"" ウィンドウ(ControlType=Pane, ClassName="ControlBandClass")
┃ ┃ ┗⊞"お気に入りとツール バー" ツール バー(ControlType=ToolBar, ClassName="ToolbarWindow32")
┃ ┗⊟"" ウィンドウ(ControlType=Pane, ClassName="ControlBandClass")
┃ ┗⊞"" ウィンドウ(ControlType=Pane, ClassName="DirectUIHWND")
┣⊡"" ウィンドウ(ControlType=Pane, ClassName="CommandBarClass")
┣⊟"" ウィンドウ(ControlType=Pane, ClassName="ControlBandClass")
┃ ┣⊡"ITBarHost" ウィンドウ(ControlType=Pane, ClassName="InternetToolbarHost")
┃ ┗⊞"{ブラウザのタイトルバー}" ツール バー(ControlType=ToolBar, ClassName="TabWindowClass")
┗⊟(null) タイトルバー(ControlType=Pane, AutomationId="TitleBar")
┣⊟"システム" メニューバー(ControlType=Button, AutomationId="Close")
┃ ┗⊡"システム" メニュー項目(ControlType=MenuItem)
┣⊡"元のサイズに戻す" ボタン(ControlType=Button, AutomationId="Minimize-Restore")
┣⊡"最大化" ボタン(ControlType=Button, AutomationId="Maximize-Restore")
┗⊡"閉じる" ボタン(ControlType=Button, AutomationId="Close")
→ しかし、プログラムから IEFrame の要素を見た場合、微妙に異なる階層構造が得られる
⊟"{ブラウザのタイトルバー}" ウィンドウ (ControlType=Window, ClassName="IEFrame")
┣⊟"" ウィンドウ(ControlType=Pane, ClassName="Client Caption")/子要素0
┣⊞"" ウィンドウ(ControlType=Pane, ClassName="ReBarWindow32")/子要素5 … "WorkerW" の階層が消えた!
┣⊡"" ウィンドウ(ControlType=Pane, ClassName="CommandBarClass")/子要素0
┣⊞"" ウィンドウ(ControlType=Pane, ClassName="Frame Tab")/子要素2 … "ControlBandClass" ではない!
┗⊞"" タイトルバー(ControlType=Pane, AutomationId="TitleBar")/子要素4
→ Inspect の 32bit/64bit 版での差異ではなさそう
→ Cache で一括取得したかどうかや、TreeWalkerView で得たかどうかで変わる?
→ あるいは Unmanaged な COM 版と Managed な .NET 版の違いによるもの?
→ 現時点では原因不明のため、Inspect は参考情報と割り切っている
③Firefox のブラウザーを Inspect で開くと、 FrameworkId が "Gecko" と表示されるが
プログラムから取得した FrameworkId は "Win32" となる
→ Inspect では本来は、右側のリストがゴシック体で表示されるが、
対 Firefox の場合、何故か先頭の How found: のみがゴシック体で、
それ以外の項目はすべて 明朝体のフォントで描画されている
→ Firefox インストール後、まだ OS を再起動していないのと何か関係あるだろうか?
何にせよ FrameworkId が得られない原因は分からなかったので
FrameworkId は検索条件として使わないことにした (それ以外の条件で絞り込んで回避)