一応これで動きましたがごまかしがあります。
- 本来
NormalOutput
が欲しかったがFindAll
でとれない(TreeWalker
が必要)のと、Nameに方向制御コードがついていて面倒だったのでCalculatorResults
で^^;
- 「キーボードからの文字入力」のほうは、
SendKeys
は使えるがカッコは認識しない
cs
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Linq;
5using System.Threading;
6using System.Windows.Automation;
7
8namespace Questions263202
9{
10 internal class Program
11 {
12 private static void Main()
13 {
14 var process = Process.Start("calc");
15 try
16 {
17 Thread.Sleep(1000);
18
19 // UWPだといろいろあるようなので、Processをタイトルから取り直す
20 foreach(var p in Process.GetProcesses())
21 {
22 if(p.MainWindowTitle.Contains("電卓"))
23 {
24 process = p;
25 break;
26 }
27 }
28
29 var mainForm = AutomationElement.FromHandle(process.MainWindowHandle);
30 var btnClear = FindElementsByName(mainForm, "クリア").First()
31 .GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
32 btnClear.Invoke();
33
34 var btn7 = FindButtonsByName(mainForm, "7").First()
35 .GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
36
37 foreach(var _ in Enumerable.Repeat(0, 7))
38 {
39 btn7.Invoke();
40 }
41
42 var resultArea = FindElementById(mainForm, "CalculatorResults");
43 var EXPECTED_VALUE = "表示は 7,777,777 です";
44 var actualValue = resultArea.Current.Name;
45 Console.WriteLine("期待値 {0} に対して、結果値は {1} です", EXPECTED_VALUE, actualValue);
46 Console.WriteLine("テスト結果は {0} です", EXPECTED_VALUE == actualValue ? "OK" : "NG");
47
48 Console.ReadKey();
49 }
50 finally
51 {
52 process.CloseMainWindow();
53 }
54 }
55
56 private static AutomationElement FindElementById(AutomationElement rootElement, string automationId)
57 => rootElement.FindFirst(TreeScope.Element | TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
58
59 private static IEnumerable<AutomationElement> FindElementsByName(AutomationElement rootElement, string name)
60 => rootElement.FindAll(TreeScope.Element | TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, name)).Cast<AutomationElement>();
61
62 private static IEnumerable<AutomationElement> FindButtonsByName(AutomationElement rootElement, string name)
63 => FindElementsByName(rootElement, name).Where(x => x.Current.ClassName == "Button");
64 }
65}