Introduction

会社の海外現地法人にて、自動テストでコスト削減、みたいなことが話にあがり、こっちでもやらないとダメだよね、って話になりました。
その際に話題にあがったのがAppium
Seleniumと名前が少し似ているので、関係があると思ったら、まぁその通りで。
Seleniumは使ったことはなくて、Webアプリ用でしょ?デスクトップアプリに関係ない?と思ったら今は違っていて、Selenium(に互換のあるAPIを持つアプリ)がWebサーバーとして動作し、テスト対象アプリとテストを指示するクライアントを仲介することで、iOS、Android、VB(レガシーだよ!!)とか何でもござれのご様子。
RPA(Robotics Process Automation) の一種やないと思い始めまして、ちょっと興味が。

で、Selenium互換のAPIを持つのがAppium。そのAppiumを経由することでWindowsアプリを操作することもできます。

ちなみに、この話は、Windows 10が対象で、7や8では試せません。

ソースは下記になります

Get Started

Appiumを使うには下記の作業が必要。

  1. Windows Application Driverのインストール
  2. テストの記述・実行

Windows Application Driverのインストール

Windowsアプリを対象にするには、Windows Application Driver (WinAppDriver) が必要。
テスト対象Windowsアプリとテスト(を指示するアプリ)クライアントを仲介し、Windowsアプリの仕様や挙動を伝えるI/Fってことです。

まずは、こいつをインストールします。
下記からインストーラをダウンロードし、実行します。

インストールは大したことないので割愛。
どうでもいいですが、Windows7でもインストールは出来ますが、最終的にテスト実行時に

となりますので無駄骨です。

テストの記述・実行

もうテストが書けます!! Nugetでライブラリが配布されていますので、テストを記述したアプリを作成します。
基本は、

  • Windows Application Driverの起動
  • テストの記述・実行

です。
サンプルがネットに転がっているので少し改造させてもらいます。

上の記事は電卓(ただしUWP製の)を操作します。
が、こっちは、ネイティブのGuidgen.exeを操作してみます。
最初に

1
PM> install-package Appium.WebDriver

で、nugetの参照を追加します。
次はソースです。

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
using System;
using OpenQA.Selenium.Remote;

namespace TestGuidgen
{

internal class Program
{

static void Main()
{
//Windows Application Driver実行
var serverPath = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
@"Windows Application Driver",
"WinAppDriver.exe"
);
System.Diagnostics.Process.Start(serverPath);

// Guidgen操作
var appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", @"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\guidgen.exe");

var driver = new RemoteWebDriver(new Uri(@"http://127.0.0.1:4723"), appCapabilities);
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2));

// 最大 5 秒まで待機してボタン押下を繰り返す
for (var i = 0; i < 10; i++)
{
driver.FindElementByName("新規 GUID(N)").Click();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
}


driver.FindElementByName("終了(X)").Click();

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}

}

}

特に迷うポイントはありませんが、ボタンを探す際、ニーモニックがあると戸惑うくらいでしょう。
各コントロールの名前は、inspect.exeを使って調べることができます。

プログラムを実行すると、コンソールでWinAppDriver.exeが立ち上がり、Guidgen.exeが自動で操作されています。

注意して欲しいのは、マウスカーソルが奪われますので、作業するのは止めた方が良いです。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/TestFramework/Appium/01_Win32