SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

PythonでWindowsアプリを操作する(1):環境構築と動作確認/RPAサンプル

f:id:arakan_no_boku:20190817094431p:plain

目次

Windowsのデスクトップアプリケーションの自動操作

Windowsのデスクトップアプリケーションを、Pythonから自動操作してみます。

3回シリーズの1回目です。

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

  • 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モジュールのインストール 

動作確認のためにサンプルプログラムを実行してみます。

Appiumの仕組を使います。

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

電卓はできたので、次に電卓以外のアプリケーションでやるときに

  • 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

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

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

自分は、自社開発のデスクトップアプリのテストで、繰り返し入力が必要なテストケースのみに絞って使っていますが、inspecter.exeを起動して、テスト対象のアプリケーションを動かしながら、コツコツと情報をひろう必要があったので、WebアプリをSeleniumで使うときの3倍から4倍くらい時間がかかりました。

これを使って全面的にデスクトップアプリのテストを自動化する・・とかは、現実的ではないように・・・個人的には思います。

 

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

最後に。

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

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"」を参考にして、そのあたりを探して見つけてください。

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

ではでは。

 

第二回目・第三回目のリンク

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com