xdotool はマウス、キーボードの入力を自動化してくれるので、ディスクトップのセットアップ以外に負荷試験などのテストツールを作成することもできます。例えばWebの申し込みフォームを作成した時に、同時に多くの申し込みアクセスがあった場合の試験はどのように行っているでしょうか? 大人数で同時に申し込みボタンをクリックするのは非効率です。xdotool を使って自動で申し込みを行う、スクリプトを作成するテクニックを紹介したいと思います。
まずサンプルとして実害が無い以下のような入力フォームを作成しました。
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Test Site</title>
</head>
<body>
<form action="" method="post">
<table border="0">
<tr>
<td align="right"><b> 氏名:</b></td>
<td>
<input type="text" name="name1" size="10">
<input type="text" name="name2" size="10">
</td>
</tr>
<tr>
<td align="right"><b>年齢:</b></td>
<td>
<input type="radio" name="year">10歳代
<input type="radio" name="year">20歳代
<input type="radio" name="year">30歳代
<input type="radio" name="year">40歳代
<input type="radio" name="year">50歳代
<input type="radio" name="year">60歳以上
</td>
</tr>
<tr>
<td align="right"><b>診療科:</b></td>
<td>
<input type="checkbox" name="shinnryouka">内科
<input type="checkbox" name="shinnryouka">外科
<input type="checkbox" name="shinnryouka">皮膚科
<input type="checkbox" name="shinnryouka">眼科
</td>
</tr>
<tr>
<td align="right"><b>備考:</b></td>
<td>
<textarea rows="5" cols="20"></textarea>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="送信">
<input type="reset" value="リセット">
</td>
</tr>
</table>
</form>
</body>
</html>
更に入力の手間を省くためにコマンドの標準出力をクリップボードに保存するxselコマンドもインストールします。
$ sudo apt -y install xsel
最初にテストツールを作成する前に入力フォームの画面位置をチェックします。どの環境でも毎回、入力フォームの位置が同じになるようにブラウザのウィンドウを最大化しておきます。そして実際このフォームに入力する場合の操作を思い浮かべます。まず氏名を入力する為にカーソルを入力フォームに合わせて左クリック、その後名字を入力していくと思いますが、その操作をスクリプトに落とし込む為には、 氏名の入力フォームの位置にカーソルを合わせて「xdotool getmouselocation」コマンドを実行します。すると現在のマウスの位置を取得する事が出来ます。
$ xdotool getmouselocation
x:173 y:130 screen:0 window:37748739
これをコマンドにすると以下のようになります。
# 名字の入力フォームに移動
$ xdotool mousemove 170 130
# 左クリック
$ xdotool click 1
# 山田と入力
$ xdotool type "山田"
備考には、複数行の文字を入力できるので事前にファイルに内容を記述しておきます。
$ cat sample.txt
熱はありませんが体がダルいです。
外科で受診した事がありますが、内科は初診です。
以下のように実行するとファイルの中身がクリックボードにコピーされるので、Ctl+v で文字列がペーストできるようになります。
$ cat sample.txt | xsel --clipboard --input
スクリプトをまとめると以下のようになります。最初にターミナルで xdotool.sh 実行後、ブラウザをクリックしてブラウザをアクティブウィンドウにする時間を5秒取っています。それらも自動で行いたい場合は、先程ブラウザを起動して最大化するスクリプトを利用するとよいでしょう。また実行すると高速で値が入力され何が起こったか分からないので入力毎に1秒待機を入れてみました。このスクリプトに、ブラウザにタブを追加するコマンドや入力値を変更するif文など追加すれば、1台のマシンから多くのテスト投稿が自動で行えると思います。
xdotool.sh
#/bin/bash
# コマンド実行後ブラウザのウィンドウをアクティウィンドウにする為の時間
xdotool sleep 5
# 名字の入力フォームに移動
xdotool mousemove 170 130
# 左クリック
xdotool click 1
# 山田と入力
xdotool type "山田"
xdotool sleep 1
# 名前の入力フォームに移動
xdotool mousemove 370 130
# 左クリック
xdotool click 1
# 太郎と入力
xdotool type "太郎"
xdotool sleep 1
# 20歳代を選択
xdotool mousemove 242 155
# 実際はクリック1回だが、名前の入力候補が表示され2回クリックしないと選択出来ない
# ブラウザで候補を表示しない設定にしている場合は click 1 で良い
xdotool click --repeat 2 1
xdotool sleep 1
# 内科を選択
xdotool mousemove 165 190
xdotool click 1
xdotool sleep 1
# 備考を入力
xdotool mousemove 200 300
xdotool click 1
cat sample.txt | xsel --clipboard --input
xdotool key Ctrl+v
xdotool sleep 1
# 送信ボタンをクリック
xdotool mousemove 165 365
xdotool click 1
入力候補が表示されてしまう。
最終入力値