みなさん,こんにちは。
シンノユウキ(shinno1993)です。
この記事はPyAutoGUIでユーザーフォームのGUIテストを自動化する連載の第6回です.
今回はPyAutoGUIでユーザーフォームのチェックボックスのチェックを全て外す方法を紹介したいと思います.
では行きましょう!
前回のまとめ
前回の記事はこちらです:
前回はPyAutoGUIを用いてVBAユーザーフォームのコンボボックスの操作を行ってみました.全体のコードは以下のようになりました:
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): 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('終了しました')
今回はその続きです.
チェックボックスのチェックを外す方法は?
チェックボックスは,チェックされていない状態でクリックするとチェックされ,されている状態でクリックするとチェックが外れます.なので,連続でテストしたい際,ユーザーフォーム側の処理でフォームが初期化されない場合,PyAutoGUI側でチェックボックスのチェックを全て外さなければなりません.
それには,PyAutoGUIのスクリーンショット機能を用います.これを使うと,文字通りスクリーンショットを撮影できますし,なんといっても指定した画像を画面内から探す事もできるのです!スクリーンショットを撮影するというよりも,この機能を活用することが多いかと思います.これが非常に便利!
以下で,この機能を使用したスクリプトを作成します.
コードはこちら!
はじめに,今回作成するコードの全文を紹介します,以下のようになります:
class UserForm: def uncheck(self): try: for pos in pg.locateAllOnScreen('checkbox.png'): locate = pg.center(pos) pg.click(locate) except : return
以降で詳しく紹介していきますね.
UserFormクラスを作成
例によって,今回作成するメソッドも,クラスを作成して書いてくこととします.チェックボックスのクラスというよりは,フォームを検索し処理するという性質上,UserFormクラスが良いかなと思いましたので,このようにしました:
class UserForm: pass
このクラスにメソッドを追加していきましょう.
画面上から指定した画像の座標を取得
まずは画面上から指定した画像の座標を取得する処理を行っていきましょう.これには,PyAutoGUIの関数:locateAllOnScreen()
を用います.以下のように使用します:
引数に探したい画像のパスを指定することで,座標のジェネレータが返ってきます.「ジェネレータ」はあまり馴染みがないかもですが,一般的な関数と違い,順番に値を返してくれるものです.この関数の場合は座標で,合致した座標を順番に取り出してくれます.
この座標を取り出すためには,For in文を用います.以下のようになります:
for pos in pg.locateAllOnScreen('checkbox.png'):
探したい画像のパス:checkbox.png
には,チェックされた状態のチェックボックスの画像が入っています.皆さんも,ご自身の環境でスクリーンショットを行い,画像をPythonファイルと同じディレクトリに格納しておいてください.
posには合致した画像の座標が一つ一つ取り出され,格納されます.
今度は,それをクリックしていきましょう.最終的には以下のコードになります:
for pos in pg.locateAllOnScreen('checkbox.png'): locate = pg.center(pos) pg.click(locate)
pos
をそのままpg.click
としたいところですが,取り出された座標は左上,右上,左下,右下の座標がタプルで格納されています.なので,クリックするためには,その真ん中の座標を取得しなければなりません.それには,pg.center(pos)
を使用します.これで,画像の真ん中の座標を取得できますので,それをクリックするとOKです.
該当する画像がない時は?
上記のコードで,全てのチェックボックスのチェックを外すことができます.しかし,処理の際に,チェックのついていないチェックボックスがない場合(該当する画像が画面内にない場合)はエラーがでてしまいます.なので,そのエラーが出た際は,処理を抜けるような処理を書いていきます.その際に使用されるのがtry-expectです.以下のように書いていきます:
エラーがでるかもしれない処理
except :
エラーが出た際に行う処理
これを今回のコードに当てはめると以下のようになります:
try: for pos in pg.locateAllOnScreen('checkbox.png'): locate = pg.center(pos) pg.click(locate) except : return
これをUserFormクラスのuncheck
メソッドとして定義すればOKです.メインルーチンに加える際の処理はまた別に書いていきます:
class UserForm: def uncheck(self): try: for pos in pg.locateAllOnScreen('checkbox.png', grayscale=True): locate = pg.center(pos) pg.click(locate) except : return
まとめ
今回は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('終了しました')
連載目次
- PyAutoGuiでVBAのユーザーフォームのGUIテストを自動化する!
- PyAutoGUIを始める第一歩と基本的な使い方を紹介します
- PyAutoGUIでユーザーフォームの 簡単なGUIテストをやってみる
- PyAutoGUIでユーザーフォームのテキストボックスを操作する方法
- PyAutoGUIでユーザーフォームのコンボボックスを操作する方法
- PyAutoGUIでユーザーフォームのチェックボックスのチェックを全て外す方法|画像認識の活用現在のページ
- PyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法
- PythonファイルをEXEファイル化する「Pyinstaller」の使い方を紹介します