PyAutoGUIでユーザーフォームの 簡単なGUIテストをやってみる

みなさん,こんにちは。
シンノユウキ(shinno1993)です。

この記事はPyAutoGUIでユーザーフォームのGUIテストを自動化する連載の第3回です.

今回はPyAutoGUIで実際にユーザーフォームを開き,データの入力をしてみることにします.

では行きましょう!

前回のまとめ

前回の記事はこちらです:

前回はPythonでGUIを自動化するモジュール:PyAutoGUIをインストールする方法から基本的な使い方まで紹介しました.

今回はその続きです.

題材とするユーザーフォーム

ユーザーフォームのサンプル

今回使用するユーザーフォームはこんな感じのものです.

下記からダウンロードできます:

userform.xlsm

ユーザーフォームの目的

このユーザーフォームは,名前と性別,年齢などの基本的なデータの登録することを目的として利用します.以下のようなシートにデータを蓄積していくイメージですね.

実際に動かしてみると以下のような感じです:

テストしたいこと

このユーザーフォームで,選択した通りにデータを入力できるか,バグは起きないかなどテストしたいと考えています.実際に運用する場合,こんな単純なユーザーフォームを使用することは少ないでしょうが,千里の道も一歩から.とりあえずこのユーザーフォームをサンプルとして使用します.

PyAutoGUIでGUIテスト

実際のコードと動き

では,さっそくPyAutoGUIを使ってみましょう.コードは以下のようなものになります:

import pyautogui as pg
import pyperclip

if __name__ == "__main__":
    # 左上をクリックしてウインドウをアクティブに
    pg.click(1, 1, pause=2.0)

    # フォームを開く
    btn_show_form = (674, 265)
    pg.click(btn_show_form, pause=1.0)

    # 名前を入力
    txt_name = (947,391)
    pg.click(txt_name, pause=1.0)
    pyperclip.copy('名前')
    pg.hotkey('ctrl', 'v')
        
    # 男性ボタンをクリック
    opt_men = (915, 446)
    opt_women = (915, 492)
    pg.click(opt_men, pause=1.0)
    
    # 年齢を選択
    cmb_age = (915, 547)
    pg.click(cmb_age, pause=1.0)
    pg.press('down')

    # 最終確認1をクリック
    chk_1 = (844, 600)
    pg.click(chk_1, pause=1.0)

    # 最終確認2をクリック
    chk_2 = (844, 630)
    pg.click(chk_2, pause=1.0)

    # OKボタンをクリックする
    btn_ok = (1040,677)
    pg.click(btn_ok, pause=1.0)

    # 終了を知らせる
    pg.alert('終了しました')

これを実行すると以下のようになります:

では,コードを解説していきます.

Excelをアクティブに

まずは最初にExcelをアクティブにしなくてはなりません.今回はコードを実行するエディタとExcelを左右に並べて配置しました.左側:Excel,右側:エディタです.最初に以下のコードを実行し,左側のExcelをアクティブにします:

pg.click(1, 1, pause=2.0)

フォームを開く

次はフォームを開きます.以下のコードを実行します:

btn_show_form = (674, 265)
pg.click(btn_show_form, pause=1.0)

btn_show_formには,Excelのシート上にあるフォームを開くボタンの座標が代入されています.それをクリックするコードです.これでフォームを開くことができます.

名前を入力

次に名前を入力していきます.以下のコードを実行します:

txt_name = (947,391)
pg.click(txt_name, pause=1.0)
pyperclip.copy('名前')
pg.hotkey('ctrl', 'v')

txt_nameには,名前を入力するテキストボックスの座標が入力されています.pg.clickでその座標を指定することでテキストボックスを選択・アクティブな状態にします.

その後,Pythonのクリップボードをを活用するライブラリ:pyperclipの力を借りて日本語を入力します.pyperclip.copy('名前')で名前をクリップボードにコピーします.そして,pg.hotkey('ctrl', 'v')でショートカットキー:ctrl + vでクリップボードの貼り付けを実行します.これでテキストボックスに日本語を入力できます.

男性ボタンをクリック

次は以下のコードを実行してください:

opt_men = (915, 446)
opt_women = (915, 492)
pg.click(opt_men, pause=1.0)

最初の2行は単にオプションボタンの座標を変数に代入しているだけです.3行目でopt_menだけクリックしています.

年齢を選択

次は年齢を選択します.以下のコードを実行してください:

cmb_age = (915, 547)
pg.click(cmb_age, pause=1.0)
pg.press('down')

1行目で座標を変数に代入し,2行目でそれをクリックしています.3行目では,キーボードの下矢印を押しています.コンボボックスでアイテムを選択する場合,ドロップダウンでアイテムが表示されるので,そのアイテムごとに座標を指定して選択するのは面倒です.なので,下矢印を押すことでその代わりをしています.

チェックボックスをクリック

次に2つのチェックボックスにチェックを入れます.以下のコードを実行してください:

chk_1 = (844, 600)
pg.click(chk_1, pause=1.0)

chk_2 = (844, 630)
pg.click(chk_2, pause=1.0)

これでそれぞれのチェックボックスをクリックします.

OKボタンをクリックしてアラート

最後にOKボタンをクリックしてデータを挿入し,終了を示すアラートを表示させましょう.以下のコードを実行してください:

btn_ok = (1040,677)
pg.click(btn_ok, pause=1.0)

pg.alert('終了しました')

クラス化して楽にコードを書けるようにしよう

以上でとりあえず目的は達成できました.しかし,こういうRPA的な利用は,コードの流れが読みづらく,またフォームの部品ごとにそれぞれ別の処理が必要になります.

なので,これらの部品をクラス化し,以降のコーディングを楽にできるように工夫していきましょう.コードを以下の様に変更してください:

import pyautogui as pg
import pyperclip

class UserForm:
    pass

class Control:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def click(self, cliks=1, interval=0, button='left', pause=1):
        pg.click(self.x, self.y, clicks=cliks, interval=interval, button=button, pause=pause)

class TextBox(Control):
    pass

class ComboBox(Control):
    pass

class OptionButton(Control):
    pass

class CheckBox(Control):
    pass

class CommandButton(Control):
    pass

if __name__ == "__main__":
    # 左上をクリックしてウインドウをアクティブに
    pg.click(1, 1, pause=2.0)

    # フォームを開く
    btn_show_form = Control(674, 265)
    btn_show_form.click()

    # 名前を入力
    txt_name = TextBox(947,391)
    txt_name.click(pause=1.0)
    pyperclip.copy('名前')
    pg.hotkey('ctrl', 'v')
        
    # 男性ボタンをクリック
    opt_men = OptionButton(915, 446)
    opt_women = OptionButton(915, 492)
    opt_men.click()
    
    # 年齢を選択
    cmb_age = ComboBox(915, 547)
    cmb_age.click()
    pg.press('down')

    # 最終確認1をクリック
    chk_1 = CheckBox(844, 600)
    chk_1.click()

    # 最終確認2をクリック
    chk_2 = CheckBox(844, 630)
    chk_2.click()

    # OKボタンをクリックする
    btn_ok = CommandButton(1040,677)
    btn_ok.click()

    # 終了を知らせる
    pg.alert('終了しました')

Controlクラスにclickメソッドを追加しました.内部ではpyautoguiのclickが動いていますが,座標の指定を省略できるようにしています.

Controlクラスを作成し,それぞれのフォーム部品も継承によって作成しました.これらへの機能追加は次回以降行っていくことにします.

まとめ

今回は実際にPyAutoGUIを用いて簡単なGUIテストを行ってみました.次回以降,これに機能を追加する形で,もっと簡単にテストを実行できる仕組みを解説していきたいと思います.

連載目次

  1. PyAutoGuiでVBAのユーザーフォームのGUIテストを自動化する!
  2. PyAutoGUIを始める第一歩と基本的な使い方を紹介します
  3. PyAutoGUIでユーザーフォームの 簡単なGUIテストをやってみる現在のページ
  4. PyAutoGUIでユーザーフォームのテキストボックスを操作する方法
  5. PyAutoGUIでユーザーフォームのコンボボックスを操作する方法
  6. PyAutoGUIでユーザーフォームのチェックボックスのチェックを全て外す方法|画像認識の活用
  7. PyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法
  8. PythonファイルをEXEファイル化する「Pyinstaller」の使い方を紹介します
タイトルとURLをコピーしました