"BOKU"のITな日常

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

Windowsアプリのelementの取得・値のセット・メニュー選択/Appium+python

基本中の基本である画面パーツ(ボタンとかテキストボックスとか)を識別して、何等かのアクションをさせる基本的な方法を確認します。

今回はサンプルとして、「さくらエディター」への文字列入力とメニュー操作をしてみます。

f:id:arakan_no_boku:20190817094431p:plain

 

今回の記事の前提

 

WinAppDriverやinspect.exeなど、必要なものがインストールされて、動く環境になっていることが前提です。

まだの場合はこちらの記事を参照して、やっといてください。

arakan-pgm-ai.hatenablog.com 

 

まずは動かすための情報収集から

 

アプリケーションを使うには、起動して、何かを入力や選択して、ボタンを押して何かをさせる・・みたいなことを繰り返すことになります。

つまり。

自動化するには、目的のボタンとかテキストボックスとかを識別する必要があります。

これらのボタンなどの画面パーツを、WinAppDriverでは「Element(エレメント)」と呼びます。

前回の記事の電卓のサンプルを見ても、ボタンのエレメントを選択して、click()したり、内容を取得するの繰り返しです。

arakan-pgm-ai.hatenablog.com

だから。

基本中の基本として、エレメントを選択する方法を把握しておく必要があります。

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つで概ねいけてしまいます。

ということで。

当面、この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つは何とかできました。

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

今回はこんなところで。

ではでは。