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

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

PythonでWindowsアプリを操作する(2):画面パーツ取得・値セット・メニュー選択/RPAサンプル

 

f:id:arakan_no_boku:20190817094431p:plain

目次

はじめに

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

環境構築等は第一回目を参照ください。

arakan-pgm-ai.hatenablog.com 

 

画面パーツの情報収集

画面のテキストボックスやボタンなどの画面パーツを「Element(エレメント)」と呼びます。

これが取得できないと、操作のなにもできないので、エレメントを選択する方法を把握しておく必要があります。

WinAppDriverがサポートするエレメント取得方法の一覧がこの資料にあります。 

github.com

ただ、こちらの資料はC#とかで使う命名規則っぽく、そのままPythonには書けません。

pythonのメソッドを追記して加工してみました。

Client API Python inspect.exe
FindElementByAccessibilityId find_element_by_accessibillity_id AutomationId
FindElementByClassName find_element_by_class_name ClassName
FindElementById find_element_by_id RuntimeId (decimal)
FindElementByName find_element_by_name Name
FindElementByTagName find_element_by_tag_name LocalizedControlType (upper camel case)
FindElementByXPath find_element_by_xpath Any

これらを使うには引数としてキー情報を渡します。

これはinspect.exeを使って取得する前提で上記資料は書かれてます。

ただ、自分が試してみた感じだと。

  • find_element_by_accessibillity_id
  • find_element_by_class_name
  • find_element_by_name

の3つ以外は少々使い方が難しいので、当面、この3つでやってみます。 

 

調査ツール:inspect.exe

調べるには、inspect.exeを起動してた状態で、調べたいアプリケーションの項目にフォーカスをあてます。

すると、右側のウィンドウに情報が表示されます。

f:id:arakan_no_boku:20190819233433p:plain

inspect.exeの起動の方法とかは、前回の記事を参照ください。

例えば、さくらエディタの入力画面をポイントしている時の例です。

f:id:arakan_no_boku:20190824150047p:plain

これを見ると、NameもClassNameの「SakuraView166」だということがわかります。

こんな感じで、適切なキーワードを探すのでしょうね。 

 

さくらエディタで操作を試してみる

とりあえず、以下の処理を自動化してみます。

  • さくらエディタを開く
  • 3行文字列を入力する
  • 編集>すべて選択で「全選択」する
  • 変換>小文字で「英大文字をすべて小文字に変換」する

ソースはこんな感じになります。

py_windriver_test01.py

import unittest
from appium import webdriver


class SampleTests(unittest.TestCase):

    def setUp(self):
        # set up appium
        desired_caps = {}
        # さくらエディター
        desired_caps["app"] = 'C:/Program Files (x86)/sakura/sakura.exe'
        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):
        # Nameによる取得
        el01 = self.driver.find_element_by_name("SakuraView166")
        # 文字列の書き込み
        el01.send_keys('一行目のNAME-TEXT\n')
        el01.send_keys('二行目のName-Text\n')
        # Class_Nameによる取得
        el02 = self.driver.find_element_by_class_name("SakuraView166")
        # 追加書き込み
        el02.send_keys('追加行Class_Name-Text\n')
        # 編集メニューを開き、すべて選択を選ぶ
        self.driver.find_element_by_name('編集(E)').click()
        self.driver.find_element_by_accessibility_id("30401").click()
        # 変換メニューを開き、英大文字を英小文字に変換する
        self.driver.find_element_by_name('変換(C)').click()
        self.driver.find_element_by_accessibility_id("30800").click()
        # とりあえず結果は目視で確認するので、テストは強制OKにしておく
        self.assertTrue(1)


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

特に終了処理はいれていませんが、最後は自動的にアプリケーションは終了します。

さくらエディタの場合は、ファイルの保存ダイアログが表示されてとまるので、そこで結果は目視確認できます。

なので、テストの中で結果確認ははしょって、常にOKを返すようにしました。

うまく動いた時の結果画面はこんな感じ。 

f:id:arakan_no_boku:20190824230044p:plain

うん。

  • エレメントの取得
  • 値のセット
  • クリック

この3つは何とかできました。

メニューの操作も、ちゃんとメニューを開いてから選択する・・の順序を守れば、うまくいくこともわかりました。

ではでは。

第一回目・第三回目の記事リンク

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com