"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

Python+AppiumでWindowsアプリを操作する/インストールと環境構築と動作確認

seleninumライクにWindowsネイティブアプリケーションの自動テストができるWindowsAppDriverをpythonで使える環境を準備します。

f:id:arakan_no_boku:20190817094431p:plain

 

はじめに

 

WebアプリケーションやWebページならSeleniumを使って自動操作できます。

でも。

Windowsのデスクトップアプリケーションには使えません。

沢山の項目を繰り返し入力しないといけない時などで、Seleniumによる自動化は役に立っているので、Windowsでもできればな・・と思っていたら、どうも、Appiumというのを使えばできるらしい・・という情報がありました。

なので、どの程度使えるものなのかを試してみようと思います。

今回のポイントとしては。

  • WinAppDriverのインストール
  • WinAppDriverの動かし方の確認
  • PythonのAppiumモジュールのインストール
  • Appiumサンプルプログラムで電卓を操作する
  • 自動操作に必要なIDやname的な情報を調べる方法の確認
  • 調査用ツールのインストールと実行方法の確認 

です。

 

WinAppDriverのインストール

 

動作に必要なのはWinAppDriverです。

こちらからダウンロードできます。

github.com

WinAppDriverをダウンロードします。

同じページに、WinAppDriver UI Recorderもあるので、間違わないように。

WinAppDriver(Windows Application Driver)は、SeleniumライクなUIテストオートメーションをサポートするWindowsアプリケーション用のサービスプログラムです。

まずは、WindowsApplicationDriver.msiをダウンロードしてインストールします。

 

WinAppDriverの動かし方の確認

 

インストールが正常終了していたら、以下のプログラムを実行します。

C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe

スタートメニューとかには登録されてないので、コマンドプロンプトを管理者として実行して動かします。

たいていは、一発で動かないで以下のような画面になると思います。

f:id:arakan_no_boku:20190816234146p:plain

Developer mode is not enabled. Enable it through Settings and restart Windows Application Driver Failed to initialize: 0x80004005

ようするに「開発者モードじゃないから動かせないよ」と言ってます。

そんな時は、とりあえずWindowsを「開発者モード」に切り替えます。

Windowsの設定画面で「開発者向け設定」を開きます。

検索ウインドウで「開発者向け」と入力すると、選択肢としてでてきます。

f:id:arakan_no_boku:20190818170719p:plain



開発者向け設定で、開発者モードに切り替えます。

以下のデフォルトから「開発者オード」に選択しなおします。

ただ、開発者モードはセキュリティ的なリスクがあるので、実行するとき以外はデフォルトに戻しておくようにします。

f:id:arakan_no_boku:20190818170927p:plain

この状態で再度、WinAppDriverを実行します。

うまく動けば、以下のように待ち状態にはいります。

f:id:arakan_no_boku:20190816235617p:plain

Windows Application Driver listening for requests at: http://127.0.0.1:4723/
Press ENTER to exit.

http://127.0.0.1:4723/」でリスニングするってあたりが、WebDriverライクですね。

 

PythonのAppiumモジュールのインストール

 

WindowsAppDriver の動かし方がわかったところで、まず、動作確認のためにサンプルプログラムを実行してみます。

Appiumの仕組を使います。

自動化テストといえば、Selenium/WebDriverが有名です。

ただ、Selenium/WebDriverは主にはWebブラウザが操作対象になります。

それに対して、Appiumはネイティブアプリに提供範囲を拡大します。

つまり、WindowsネイティブアプリやAndroidスマホなんかの自動テストをSeleniumみたいにやるための仕組です。

appiumをpythonから使う場合

pip install Appium-Python-Client

しておく必要があります。

でも、個別ではなく、以下でseleniumなども含めて、まとめてインストールしたほうが楽なので、自分はそうしてます。

robotframeworkは今回は使わないのですけどね。

pip install robotframework-appiumlibrary

 

Appiumのサンプルプログラムで電卓を操作する

 

さて、ソースコードはこちらです。

py_windriver_test00.py

    import unittest
from appium import webdriver


class SampleTests(unittest.TestCase):

    def setUp(self):
        # set up appium
        desired_caps = {}
        desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4723',
            desired_capabilities=desired_caps)

    def tearDown(self):
        self.driver.quit()

    def test_input(self):
        self.driver.find_element_by_accessibility_id("clearButton").click()
        self.driver.find_element_by_accessibility_id("num7Button").click()

        result = self.driver.find_element_by_accessibility_id(
            "CalculatorResults")
        self.assertIn(" 7 ", str(result.text))

    def test_calc(self):
        self.driver.find_element_by_accessibility_id("num2Button").click()
        self.driver.find_element_by_accessibility_id("plusButton").click()
        self.driver.find_element_by_accessibility_id("num7Button").click()
        self.driver.find_element_by_accessibility_id("equalButton").click()

        result = self.driver.find_element_by_accessibility_id(
            "CalculatorResults")
        self.assertIn(" 9 ", str(result.text))


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(SampleTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

補足します。

desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"

 この部分が電卓プログラムの指定です。

Microsoft.WindowsCalculator_8wekyb3d8bbwe!Appが電卓を示すショートカットです。

この名称の調べ方が結構難しいのですが、Windows10アプリの場合だと、こちらの記事がかなり参考になります。

zakkinks.com

command_executor='http://127.0.0.1:4723'

 の部分で、WinAppDriverがリッスンしているURLをわたします。

あとは、「find_element_by_accessibility_id」にIDを指定して、cloickイベントでボタンを押したり、結果を取得したりしてます。

実際。

WinAppDriverを動かした状態で、上記プログラムを実行すると、電卓が立ち上がってきて、ボタンを順番に押しながらテストされていきます。

テストは「クリアボタンと番号の7を押して、7の表示を確認」と「2+7をボタンで押して答えが9になっている」のを確認するという、実に意味のないものですが、まあ、自動化のサンプルなのでとりあえず。

f:id:arakan_no_boku:20190817114656p:plain

結果はこんな感じ。

f:id:arakan_no_boku:20190817114807p:plain

 

自動操作に必要なIDやname的な情報を調べる方法の確認

 

ここまでやると、当然の疑問がわいてきます。

サンプルの電卓はわかったけど、他のアプリケーションでやるときに、いろいろ必要な情報があるはずだけど・・・。

  • Appiumの他の使い方はどうやって調べるのか?
  • アプリケーションの識別名や画面部品のIDをどうやって調べるのか?

がわからない・・ということです。

 

Appiumの他の使い方はどうやって調べるのか?

 

AppiumのAPIドキュメントは、ここにあります。

appium.io

ただ、全編英語で、正直わかりやすくもありません。

対応言語も多く、ネットでさがしても、pythonjavascriptc#RubyJavaなどいろんな言語のサンプルがでてきますし、何よりも、日本語の情報が少ないですが、まあ、よほど凝らないかぎり、このリファレンスを参考いコツコツするしかないかな・・・と、個人的には思ってます。

 

アプリケーションの識別名や画面部品のIDをどうやって調べるのか?

 

Windowsに関して言えば、マイクロソフトが2通りの方法を提供してくれてます。

  • WinAppDriver UI Recorder
  • inspect.exe

です。

WinAppDriver UI Recorderは、これを動かした状態でWindowsアプリケーションを動かすとそれを記録して、かつ、C#のソースをはきだしてくれるというものです。

起動して「Record」ボタンを押してから、Windowsアプリを動かすと、以下のように記録されていきます。

f:id:arakan_no_boku:20190817123304p:plain

inspect.exeも同じように、動作中のアプリケーションの詳細情報を確認できます。

f:id:arakan_no_boku:20190817123645p:plain

とても詳細な情報が確認できます。

でも、情報がありすぎて、ここから必要な情報を探すのは少々大変そうです。

とりあえず。

自分も今の段階では、Windowsアプリで情報のあるものを実験的にやってみている・・ということしかできてません。

これらを使って、実際のアプリケーションを自動テストしていくノウハウについては、これから地道にみていく必要がありそうです。

自分もわかったことがあれば記事にしていくつもりではいますが、まだまだ、情報不足ではありますね。

 

調査用ツールのインストールと実行方法の確認 

 

最後に。

上記で紹介したツールのインストールと実行方法だけ書いておきます。

WinAppDriver UI Recorderは、WinAppDriverと同じところからダウンロードできます。 

github.com

 単なるZIPファイルなので、展開して適当なフォルダにコピーして、EXEを実行すればいいです。

inspect.exeは、WindowsSDKに含まれてます。

WindowsSDKは以下からインストーラをダウンロードしてインストールします。

developer.microsoft.com

inspect.exeの場所は、インストールする環境で微妙に違ったりして探しにくいのですが、「"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86\inspect.exe"」を参考にして、そのあたりを探して見つけてください。

自分は両方共、ショートカットをデスクトップにつくって使ってます。

さて。

長くなったので、今回はこんなところで。

ではでは。