前回の記事では、Winium WebDriverを使ってメモ帳を操作してみました。
GitHubを見てみると、WinFroms、WPFベースのアプリ操作自動化を目的とした「Winium.Cruciatus」というフレームワークもあるようなので、こちらも試してみることにします。
(Cruciatus = ラテン語で拷問?ずいぶんと物騒な名前です。)
下準備
Winium WebDriverと同じく、必要なパッケージをNuGetからインストールします。
nuget install "Winium.Cruciatus"
Winium.Cruciatusでメモ帳を操作するコード
準備ができたら、さっそくコードを書いていきます。
/*
* 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を使えばビルドすることができます。)
/*
* 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!