1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PyAutoGuiを使って、いまさらWindows Server 2003 R2上で動くVB6のプログラムのUIテストを自動化してみた(入力コマンドチートシート)

Last updated at Posted at 2020-07-03

winautoguiでのキーおよびマウス操作

UWSCでがんばってたUIテスト自動化で、どうやってもキー入力を受け付けない要素が出てきたので(おのれグレープシティー)pyAutoGUIで自動化スクリプトを書くときに自分で使うであろうコマンドをPyAutoGui's documentationから抜き出してきました。

ちなみに私ががんばってる環境は以下の通り
OS:Windows Server 2003 R2
アプリの開発言語:Visual Basic 6
今回自動化に使用したPythonのバージョン:2.7.18

この記事を書くのに参考にしたサイト

偉大なる先人たちに感謝!
……pipでモジュールを導入する方法については偉大なる先人達のページをどうぞ

マウス編

マウス移動

pyautogui.moveTo(100, 200)  # 座標(100,200)にマウスカーソルが移動
pyautogui.moveTo(None,500)  # 座標(100,500)にマウスカーソルが移動
pyautogui.moveTo(600,None)  # 座標(600,500)にマウスカーソルが移動

マウスクリック

pyautogui.click()              # マウスカーソルがある場所でクリックイベント発火
pyautogui.click(x=100, y=200)  # マウスカーソルを座標(100,200)に移動してクリックイベント発火
pyautogui.click(button='right')# これで右クリック

マウスクリック応用編

pyautogui.click(clicks=2)                 # 左クリックボタンでダブルクリック
pyautogui.click(clicks=2, interval=0.25)  # 左クリックボタンクリック→0.25秒待機→左クリックボタンクリック
pyautogui.click(button='right', clicks=3, interval=0.25) #マウス右ボタントリプルクリック、間隔0.25秒

キーボード入力編

文字列送信

pyautogui.write('ハローワールド!')  # ただ単に「ハローワールド!」が出力される
pyautogui.write('hello world!', interval=0.25) #1文字ずつ0.25秒間隔で"hello world!"が出力される

キー押下(押して離す)

pyautogui.press('enter')  # エンターキーが押下される
pyautogui.press('f1')     # ファンクション1[F1]キーが押下される
pyautogui.press('left')   # 左矢印[←]キーが押下される

キーダウン(キーを押しっぱなしにする)

pyautogui.keyDown('shift') # [Shift]キーを押しっぱなしにする。keyUpするまでそのまま
pyautogui.press('left')    # pressなので[←]キーが押して離される
pyautogui.press('left')    # pressなので[←]キーが押して離される
pyautogui.press('left')    # pressなので[←]キーが押して離される
pyautogui.keyUp('shift')   # [Shift]キーが上がる(キーを離す)

キー操作ちょっと応用編

配列要素にキーコードを持たせてwrite()関数のように使ってやる

pyautogui.press(['left', 'left', 'left'])        # 配列要素で実現版
pyautogui.press('left',presses=3)                # 同じボタンの連打ならpressesオプションで回数が指定できる
pyautogui.press('left',presses=3, interval=0.25) # write()と同様にintervalオプションで入力間隔を調整できる

キーの同時押し(ホットキー)機能

pyautogui.hotkey('ctrl', 'shift', 'esc') #[Ctrl]+[Shift]+[Esc]でタスクマネージャーを起動

もちろんこのように書いても良いけれど……

pyautogui.keyDown('ctrl')
pyautogui.keyDonw('shift')
pyautogui.keyDown('esc')
pyautogui.keyUp('esc')
pyautogui.keyUp('shift')
pyautogui.keyup('ctrl')

ホットキー機能使った方が簡単だよね。

仮想キー一覧

pyAutoGuiで使える仮想キーの一覧だよ。

['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']

意外と使いそうな所だと

['kana', 'kanji','ctrlright','decimal','numlock']

とかですかね?

日本語文字列どうする問題

コピペです。はい。ご唱和ください。日本語はコピペです。
がんばりました。私も。Unicodeがいけないのか?はたまたShift-JISじゃないとだめなのか?と
答えは先人が出しておりました。

import pyperclip as clipboard
clipboard.copy("日本語文字列")
pyautogui.hotkey('ctrl','v')

これですよ。
あとは

unicodedecodeerror 'ascii' codec can't decode

に不幸にも出会ってしまったときには先人達の知恵をお借りしてデフォルトの文字コードをUTF-8にしちゃいましょう。

2020/07/06 追記

コピペで対応できない(コピペしても日本語部分が落ちちゃう)という事象が発生したので、もう一度日本語入力をなんとかする方法を検討しました。
結論から言うと、

import pyautogui as gui
# 前提条件としてIMEが英数字入力となっていること
gui.press('kanji')
gui.press(['t','y','d','@'], interval=0.5) # カナ入力で「かんじ」と入力
gui.press(['shift','enter','kanji'], interval=0.5)

のようにある程度のintervalを設定しつつキー入力で漢字を入力するということを要求されました。
さらに、マウスで確実に入力対象にフォーカスを当てるというのもテクニックとして必要な場合があります。
たとえば、(x,y,w,h)=(25,25,100,25)のようなテキスト入力フィールドがあると想定した場合に

import pyautogui as gui
# ダブルクリックで確実にフォーカスを取る
gui.doubleClick(18,30) # ←テキストボックスにフォーカスを当ててIビームが良い感じになる座標を指定してダブルクリック
gui.press(['t','y','d','@'], interval=0.5) # カナ入力で「かんじ」と入力
gui.press(['shift','enter','kanji'], interval=0.5)

なんとことも必要な場面がありました。

ちなみに私カナ入力信者なのでローマ字入力は検証していません(めんどうだったのごめんなの)。ごめんあそばせ。

まとめ

基本的にはWelcome to PyAutoGUI's documentation!の例をそのまままとめただけ+自分のトライアンドエラーの記録ですが、これだけでもあると助かる人が居れば幸いです。
それでは良い自動化ライフを!

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?