前回の記事では、Winium WebDriverを使ってメモ帳を操作してみました。
GitHubを見てみると、WinFroms、WPFベースのアプリ操作自動化を目的とした「Winium.Cruciatus」というフレームワークもあるようなので、こちらも試してみることにします。
(Cruciatus = ラテン語で拷問?ずいぶんと物騒な名前です。)
下準備
Winium WebDriverと同じく、必要なパッケージをNuGetからインストールします。
1 | nuget install "Winium.Cruciatus" |
Winium.Cruciatusでメモ帳を操作するコード
準備ができたら、さっそくコードを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /* * Winium.Cruciatusでメモ帳を操作するサンプル * @kinuasa * * [要参照] * UIAutomationClient, * UIAutomationTypes, * Winium.Cruciatus(Winium.Cruciatus.dll), * WindowsInput(WindowsInput.dll) * NLog(NLog.dll) */ using System; using System.Windows.Automation; using Winium.Cruciatus.Core; using Winium.Cruciatus.Extensions; namespace Sample2 { class Program { public static void Main( string [] args) { var calc = new Winium.Cruciatus.Application( @"C:\Windows\System32\calc.exe" ); calc.Start(); var winFinder = By.Name( "電卓" ).AndType(ControlType.Window); var win = Winium.Cruciatus.CruciatusFactory.Root.FindElement(winFinder); //電卓の'5','6','7'ボタンクリック //AutomationId指定 win.FindElementByUid( "num5Button" ).Click(); win.FindElementByUid( "num6Button" ).Click(); win.FindElementByUid( "num7Button" ).Click(); Console.Write( "Press any key to continue . . . " ); Console.ReadKey( true ); } } } |
上図の通り、意図した通りに動作しているようです。
GitHubにも書いてありますが、Winium.CruciatusはUI Automationのラッパーのようで、AutomationIdでエレメントを指定することもできます。
「Inspect」等のツールを使えば、AutomationIdを調べることができるので、Winium.Cruciatusを使用する際には、事前にダウンロードしておくことをお薦めします。
Winium.CruciatusでWPFサンプルアプリを操作するコード
GitHubにはテスト用のサンプルアプリも置いてあります。
せっかくなので、このWPFアプリの操作も試してみたいと思います。
(サンプルアプリは、Visual Studioが無くてもMSBuildを使えばビルドすることができます。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /* * Winium.CruciatusでWPFサンプルアプリを操作するコード * @kinuasa * * [要参照] * UIAutomationClient, * UIAutomationTypes, * Winium.Cruciatus(Winium.Cruciatus.dll), * WindowsInput(WindowsInput.dll) * NLog(NLog.dll) */ using System; using System.Windows.Automation; using Winium.Cruciatus; using Winium.Cruciatus.Core; namespace Sample4 { class Program { public static void Main( string [] args) { var testApp = new Winium.Cruciatus.Application( @"C:\Software\WpfTestApplication\WpfTestApplication.exe" ); testApp.Start(); //RibbonTabItem2クリック var tab2 = CruciatusFactory.Root.FindElementByUid( "RibbonTabItem2" ); tab2.Click(); //RibbonCheckBoxクリック tab2.FindElementByUid( "RibbonCheckBox" ).Click(); //TabItem4クリック var tab4 = CruciatusFactory.Root.FindElementByUid( "TabItem4" ); tab4.Click(); //thirteenセルにフォーカス foreach ( var cell in tab4.FindElements(By.AutomationProperty(AutomationElementIdentifiers.ClassNameProperty, "DataGridCell" ))) { if (cell.Properties.Name == "thirteen" ) { cell.SetFocus(); } } Console.Write( "Press any key to continue . . . " ); Console.ReadKey( true ); } } } |
リボンのタブやチェックボックスの操作等、簡単なコードで処理することができました。
素のUI Automationだとコードが長くなりがちなので、コードをスッキリさせたい場合は、Winium.Cruciatusを使うのは割とアリだと思います。
(少なくともWinium WebDriverよりは使いやすいです。)
Hi,
I want to find element in list of combobox? Can you help me!