投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 は検索条件として使わないことにした (それ以外の条件で絞り込んで回避)