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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

1回答

8031閲覧

UIAutomationがうまくいかない

aglkjggg

総合スコア769

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/10/22 03:26

編集2022/01/12 10:55

###前提・実現したいこと
C#でUI テストを行うためにUI Automationについて調べていました。
電卓を用いたサンプルは以下のサイトの通り行い、無事動かすことが出来ました。
http://tercel-tech.hatenablog.com/entry/2015/04/29/181723

試しに電卓ではなく、「スクリーンキーボード」※1で何かキーを押すのを自分で実装しようとしたところ、
うまくキーの要素が取得できないため、キーがクリックできませんでした。

イメージ説明
※1 スクリーンキーボード(%windir%\system32\osk.exe)

###発生している問題・エラーメッセージ
子要素が取得できない為、ハマっています。

###該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Diagnostics; 4using System.IO; 5using System.Linq; 6using System.Runtime.InteropServices; 7using System.Text; 8using System.Threading; 9using System.Threading.Tasks; 10using System.Windows.Automation; 11using Winium.Cruciatus; 12using Winium.Cruciatus.Core; 13using Winium.Cruciatus.Extensions; 14 15namespace testxxx 16{ 17 class Program 18 { 19 // 指定したID属性に一致するAutomationElementを返します 20 static AutomationElement FindElementById(AutomationElement rootElement, string automationId) 21 { 22 return rootElement.FindFirst( 23 TreeScope.Element | TreeScope.Descendants, 24 new PropertyCondition(AutomationElement.AutomationIdProperty, automationId)); 25 } 26 27 // 指定したName属性に一致するAutomationElementをすべて返します 28 static IEnumerable<AutomationElement> FindElementsByName(AutomationElement rootElement, string name) 29 { 30 return rootElement.FindAll( 31 TreeScope.Element | TreeScope.Descendants, 32 new PropertyCondition(AutomationElement.NameProperty, name)) 33 .Cast<AutomationElement>(); 34 } 35 36 // 指定したName属性に一致するボタン要素をすべて返します 37 static IEnumerable<AutomationElement> FindButtonsByName(AutomationElement rootElement, string name) 38 { 39 const string BUTTON_CLASS_NAME = "Button"; 40 return from x in FindElementsByName(rootElement, name) 41 where x.Current.ClassName == BUTTON_CLASS_NAME 42 select x; 43 } 44 45 static void Main(string[] args) 46 { 47 if (Process.GetProcessesByName("osk").Count() <= 0) 48 { 49 Console.WriteLine($"Please launch osk.exe"); 50 return; 51 } 52 53 var mainForm = AutomationElement.FromHandle(Process.GetProcessesByName("osk").First().MainWindowHandle); 54 Console.WriteLine(mainForm.Current.NativeWindowHandle); 55 56 var btnClear = FindElementsByName(mainForm, "").First(); 57 Console.WriteLine(btnClear.Current.NativeWindowHandle); 58 59 // ココで要素の取得ができていない 60 var xx = btnClear.FindAll(TreeScope.Children | TreeScope.Descendants, 61 new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button)); 62 63 Console.WriteLine(xx.Count); 64 //Console.WriteLine(xx.Current.NativeWindowHandle); 65 66 Console.ReadKey(); 67 } 68 } 69}

###試したこと
・管理者権限で起動
→関係がなかった

・Inspectで要素を確認して、要素の取得方法をいろいろ試した
→上手く要素を取得することができなかった
イメージ説明

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

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

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

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

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

KSwordOfHaste

2016/10/24 04:35

「要素の取得方法をいろいろ試した」という曖昧ないいかたではなく具体的にコードで示したほうがよいと思います。
guest

回答1

0

すいません、回答ではないのですが、
常に管理者としてアプリケーションを実行させるには?
にちょろっと書いているのですが、「uiAccess="true"」にすると

オンスクリーン・キーボードなどのユーザー補助のUI(ユーザー・インターフェイス)にアクセスできるようになる。

と言うことらしいいです。(できたわけじゃないので確証はありませんが)
「uiAccess="true"」とするとデバッグできなくなるのですが、
私の理解力ではデバッグできるようにする方法がわかりませんでした。

投稿2016/11/20 07:50

Hey_CH

総合スコア437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問