質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

13042閲覧

UIAutomation で タブの内側の要素が取れない

lazex

総合スコア604

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2016/10/29 12:35

C# で UI Automation を使って、 あるアプリケーションを操作しています。
ボタンを押したり、テキストボックスへの入力など基本的なことは問題なくできています。

しかし、タブコントロールの内側の要素を取得だけができず困っています。
Inspect や UIA Verify で確認してもタブコントロールのヘッダ部分(クリックすると選択してるタブが切り替わるボタンみたいなところ)はあるのですが内側の本体が表示されていません。

ググってみると TabItem の中に Pane があって中身の要素がありそうです。
https://msdn.microsoft.com/en-us/library/ms751611(v=vs.110).aspx

また、.net4.5でコンパイルするとタブのペインが見れなくなった のようなことを書いたページもありました。
http://stackoverflow.com/questions/25617731/white-ui-automation-doesnt-recognize-the-container-pane-control-in-tab

UI Automation 自体の情報は少なくはなく、タブはよく使われるものだと思うのでタブ内の要素が見れないとなれば重大な問題でもっと情報があるように思うのですが、実際はほとんど情報がないです。

今のところ、タブ内の要素を指定するために座標指定でクリックアクションを起こしたり、タブキーを数回 SendKey で入力してフォーカス要素を取得するようにしています。
UIAutomation はテストにも使われるツールのようなので、デザインが変わる度に大きく変更が必要になる、座標指定やタブキーを押した数で目的の要素を取得するのが正しい使い方とは思えないのです。

どうにかしてタブの内側のツリーから要素を取得できないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

原因と解決方法を見つけました。

まず、操作されるアプリケーションをWPFで作ってみたのですが、対象フレームワークバージョンが4.0,4.5,4.6いずれの場合も以下のように Inspect.exe で表示されていました。 (3.5 は System.Xaml とアセンブリが違うようで準備が大変そうなので未確認)

"MainWindow" ウィンドウ ├ (null) タイトルバー └ "" タブ ├ "a" タブ項目 │ └ "a" テキスト └ "A" タブ項目 ├ "A" テキスト ├ "A" ボタン │ └ "A" テキスト └ "B" ボタン └ "B" テキスト

作ったXAMLは2つのタブにa,bとA,Bのボタンを入れただけのシンプルなものです。

XAML

1<TabControl> 2 <TabItem Header="a"> 3 <StackPanel> 4 <Button>a</Button> 5 <Button>b</Button> 6 </StackPanel> 7 </TabItem> 8 <TabItem Header="A"> 9 <StackPanel> 10 <Button>A</Button> 11 <Button>B</Button> 12 </StackPanel> 13 </TabItem> 14</TabControl>

現在フォーカスが当たって開かれているタブの中身だけですが、正しく表示されていました。


そのため、質問文書くに当たって操作していたアプリケーションはバグがあるバージョンでビルドされていて、最新だと大丈夫と一度結論づけていたのですが、他にもいくつかのパターンを試していると TabItem の中身が Inspect.exe で表示されない場合がありました。

原因は、ControlTemplate を使ってること でした。
ControlTemplate を前提に検索しているとこのページを見つけて、 ContentPresenter 要素に Name="PART_SelectedContentHost" 属性を付与したところ、ControlTemplate を使ったケースでも Inspect.exe や UIAutomation でもタブコントロール内の要素を見つけることができました。


まとめ

  • 操作されるアプリケーションを自作する場合で、TabControlControlTemplate を適用する場合は Name="PART_SelectedContentHost" の属性が必要
  • 他人が作ったアプリケーションでAutomationを前提として上記の処理をしてくれていない場合は不可能

投稿2016/11/01 13:18

lazex

総合スコア604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/11/01 13:46

なるほど・・・StackOverflowの回答は実装しそこねていることに気づかず迂遠な方法での解決ということを意味するのか・・・そこは気になりますが、参考になりました!
guest

0

タブ内の要素が見れないとなれば重大な問題

おっしゃるとおりだと思います。質問文の2つ目のページを眺めていたのですが、そこからたどれる以下のページ(下記)をみつけました。このページの回答にTabControlの下位のノードが見えない原因とその回避が書いているように見えました。しかし回避策がTabControlのサブクラスで実装を一部変更するといった内容なので一般に適用できないのかも知れません。このページに一般的なAutomationのpeerについての情報ページのリンクがあるようですのでこのあたり調べられてはいかがでしょうか。

StackOverflow:Some controls on a page are not visible for MS UI Automation

バグレベルの問題なのか仕様なのか難しそうです。どうなんだろう・・・

投稿2016/10/29 17:25

KSwordOfHaste

総合スコア18400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazex

2016/10/31 03:13

継承して OnCreateAutomationPeer をオーバーライドする方法は見ましたが、これは操作されるアプリケーションを自作していて Automation で操作されることを前提に実装しておくということですよね。 これだと自作のアプリケーションでしか使えないですよね・・・ こんな特殊な方法がフレームワーク作った人の意図する使い方とは考えにくいですしこれしか方法がないならバグじゃないのかなって思います。 他に方法がないのかか、ベストアンサーはもう少し待ってみることにします。
KSwordOfHaste

2016/10/31 04:25 編集

ベストアンサー云々はさておき質問者さんが解をみつけることと結果を情報共有することの方が大事ですね・・・ あくまで主観ですがStackOverflowの記事を読むと根本的な部分で実装しそこねているというふうに見えてしまいました。可能性は・・・ 1)バグ  Automationを利用するケースが必ずしも多くないのであまり騒ぎになっていないだけ? 2)適切な方法を取ればAutomationとして使える仕様にはなっているが多くのアプリケーションがそういう作りになっていない  こうだとしてもAutomation利用しようとする設計者にとってはバグと変わらないレベルですね。 3) ちゃんとAutomationでアクセスするなんらかの方法がある。  しかしStackOverflowの回答者がコントロールの実装を調べたうえでoverrideの解決法しかみつけられていないように思えるので、バグじゃないのかなぁと思えました。そうでないことを期待したいところですが・・・
lazex

2016/11/01 13:19

自己解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問