みなさん,こんにちは。
シンノユウキ(shinno1993)です。
この記事はPyAutoGUIでユーザーフォームのGUIテストを自動化する連載の第7回です.
PyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法を紹介し,そのデータを活用して連続でテストを行う方法を紹介したいと思います.
では行きましょう!
前回のまとめ
前回の記事はこちらです:
前回はPyAutoGUIでスクリーンショット機能を活用し,チェックボックスのチェックを外す方法について紹介しました.全体のコードは以下のようになりました:
import pyautogui as pg
import pyperclip
class UserForm:
def uncheck(self):
try:
for pos in pg.locateAllOnScreen('checkbox.png'):
locate = pg.center(pos)
pg.click(locate)
except :
return
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):
def set_text(self, string_):
self.click()
pyperclip.copy(string_)
pg.hotkey('ctrl', 'v')
def clear_text(self):
self.click()
pg.hotkey('ctrl', 'a')
pg.press('delete')
class ComboBox(Control):
def clear_box(self):
self.click()
pg.press('backspace')
def select_box(self, index):
for i in range(index):
pg.press('down')
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.set_text('名前')
# 男性ボタンをクリック
opt_men = OptionButton(915, 446)
opt_women = OptionButton(915, 492)
opt_men.click()
# 年齢を選択
cmb_age = ComboBox(915, 547)
cmb_age.clear_box()
cmb_age.select_box(1)
# 最終確認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('終了しました')
今回はその続きです.
連続してテストしたい
今まで書いてきたコードでは,テストできるのは一回だけで,テストを繰り返すことはできませんでした.しかし,実際にテストする場面では,一回だけ値を入力できればOkということは稀で,複数のテストデータを入力しながら,様々なデータで試すのが普通です.
というわけで,こちらのコードもそのような仕様に変更していきましょう.
テストデータをExcelから読み取る
せっかくExcelVBAのユーザーフォームのテスト自動化を行っているので,テストデータをCSVファイルやテキストファイルから読み込むなどという無粋なことはせずに,そのままExcelファイルから読み込むようにしましょう.
これにはPythonのライブラリ:Pandasを使用します.Pandasはデータ解析に頻繁に用いられるライブラリで,データの扱いに長けたライブラリです.これを使用してExcelからデータを読み取ります.
まずは,プログラムのはじめでPandasをインポートしてください:
import pandas as pd
import文にasをつけることで,pandasをpdと略した形で参照することができます.
Excelファイルからデータを読み取り,Pandasにおけるデータフレームの形にするのが以下の関数です:
「データフレーム」という聞き慣れない言葉が出てきましたが,心配する必要はありません.全ての列に名前がつき,一行一データのよくある形式のように捉えていただければ結構です.今回はデータ分析ではなく,テストデータを格納する形として使うだけですしね.
テストデータを用意する
では,テストデータを用意しましょう.testというシート名にし,下記のようなデータを入力してください:
性別などは“男性”とか“女性”としたいところですが,このようなデータ形式の方が後々楽なので,このようにしてください.年齢も,このようにインデックスで指定したほうがコードを書くのは楽です.
Pndasのデータフレームの使い方
データを取得する
では,実際にExcelファイルからPandasを使ってデータを読み取ってみましょう.先に紹介したコードを使用します:
df = pd.read_excel('userform.xlsm', sheet_name='test')
最初の引数はブック名です.こちらは任意のものを入力してください.これで,データフレームとしてExcelのデータを取得できます.
データフレームのループ処理
今度は,データフレームのループ処理を書いていきましょう.これが少し特殊で,データの1行目から2行目,次は3行目と繰り返していく場合,つまり1行ずつデータを取り出していく場合,データフレームのiterrows()
メソッドを使用します.
for index, row in df.iterrows():
このようにすることで,データフレームから1行ずつ取得し,それはrow
に代入されます.ちなみに,index
にはその名の通り,行のインデックスが入ります.
データフレームから値を取得するには?
データフレームから値を取得するためには,以下のようにします:
for index, row in df.iterrows():
row['列名']
これで値を取得できます.
コードを変更しよう
では,これを踏まえて,コードを変更しましょう.諸々を変更したコードが以下です:
import pyautogui as pg
import pyperclip
import pandas as pd
class UserForm:
def uncheck(self):
try:
for pos in pg.locateAllOnScreen('checkbox.png', grayscale=True):
locate = pg.center(pos)
pg.click(locate)
except :
return
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):
def set_text(self, string_):
self.click()
pyperclip.copy(string_)
pg.hotkey('ctrl', 'v')
def clear_text(self):
self.click()
pg.hotkey('ctrl', 'a')
pg.press('delete')
class ComboBox(Control):
def clear_box(self):
self.click()
pg.press('backspace')
def select_box(self, index):
for i in range(index):
pg.press('down')
class OptionButton(Control):
pass
class CheckBox(Control):
pass
class CommandButton(Control):
pass
if __name__ == "__main__":
# Excelファイルからデータを読み取る
df = pd.read_excel('userform.xlsm', sheet_name='test')
# 左上をクリックしてウインドウをアクティブに
pg.click(1, 1, pause=2.0)
btn_show_form = Control(674, 265)
btn_show_form.click()
form = UserForm()
for index, row in df.iterrows():
form.uncheck()
txt_name = TextBox(947,391)
txt_name.set_text(row['名前'])
opt_men = OptionButton(915, 446)
opt_women = OptionButton(915, 492)
ctg_sex = [opt_men, opt_women]
ctg_sex[row['性別']].click()
cmb_age = ComboBox(915, 547)
cmb_age.clear_box()
cmb_age.select_box(row['年齢'])
if row['最終確認1'] == True:
chk_1 = CheckBox(844, 600)
chk_1.click()
if row['最終確認2'] == True:
chk_2 = CheckBox(844, 630)
chk_2.click()
btn_ok = CommandButton(1040,677)
btn_ok.click()
# フォームの初期化
txt_name.clear_text()
form.uncheck()
pg.alert('終了しました')
これで,ほぼ目的のものはできました!
まとめ
今回はPyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法を紹介しました.そして,そのテストデータを実際に使用する方法も紹介しました.
これでほぼ目的を達成できました.次回は,おまけ的な内容を書けたらなと思います.
連載目次
- PyAutoGuiでVBAのユーザーフォームのGUIテストを自動化する!
- PyAutoGUIを始める第一歩と基本的な使い方を紹介します
- PyAutoGUIでユーザーフォームの 簡単なGUIテストをやってみる
- PyAutoGUIでユーザーフォームのテキストボックスを操作する方法
- PyAutoGUIでユーザーフォームのコンボボックスを操作する方法
- PyAutoGUIでユーザーフォームのチェックボックスのチェックを全て外す方法|画像認識の活用
- PyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法現在のページ
- PythonファイルをEXEファイル化する「Pyinstaller」の使い方を紹介します