読者です 読者をやめる 読者になる 読者になる

森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

自動化の話をしようじゃないか

http://image.slidesharecdn.com/aaaallforautomation-140627213852-phpapp02/95/asianaa-1-638.jpg

と言うわけでこの内容はみうみう自動化Friendly Advent Calendar2014、24日目の記事です。

自動化出来ない!

僕は自動化が好きで色んなアプリを自動化しています。特に複数のアプリを組み合わせて、人間がやるべき操作をワンクリックで全て出来るようにすることが大好きです。しかし、ワンクリック自動化には限界があります。当たり前な話ですが、アプリ側が外からの操作に対応していない場合自動化出来ません。


ワンクリックオートメーションにおいて重要なのはアプリの操作だけでなく、起動と終了もです。この3つが確実に出来ないと折角の自動化が途中で止まってしまい、手動の操作を余儀なくされます。実は操作用にスクリプトが用意しているアプリですらも、スクリプトで終了出来ないものもあります。例えばphotoshopとか。

それでも自動化 。でも、

回避方法はいくつかありますが、最も手軽な方法がキーボードエミュレーションです。つまり手動では出来るけれど、プログラムでは書けない処理は、手動の動作をプログラムでトレースしてやれば良いという発想です。これで操作出来ます。しかし、キーボードエミュレーションは最終手段で、出来る限りやらない方が良いです。


なぜなら、操作をするのに、キーボードエミュレーションではどうやっても成功する確率を100%に出来ないからです。単純な所では操作中に人間がさわって他のアプリを起動してしまうと失敗します。それ以外でもタイミングや時間、ポップアップなどさまざまな要素で失敗します。

電卓とメモ帳操作VBS

では実際に電卓とメモ帳を操作してみましょう。電卓で11111111 / 9を計算してその結果をメモ帳に貼って保存する自動化を作ろうと思います。しかしメモ帳も電卓もスクリプトなどは用意されていません。そこでVBSでキーボードエミュレーションで対応してみます。

さて、このVBSは、WScript.Sleep 1000を短くすると失敗します。1000でもマシンスペックによっては失敗するかもしれません。では十分に長い時間を設定すれば良いかといえば、今度は別の危険が増えます。誰かが操作したり、IMがポップアップしたりするかもしれません。つまり適切な時間を決めるのがとても難しいのです。

あれ?この話

さて、ここまでの内容はFriendlyの作者本人がアドベントカレンダーで散々書いていた内容と類似しています。これは意図していたわけではないですが、一方はテスト自動化の話、もう一方はアプリ自動化の話です。内容的には違うのですが、やっていることはとても似ています。


失敗するテストは必ず失敗してほしい、成功するテストは必ず成功してほしい。そう考えて作られたライブラリ。この知見をアプリの操作に使ってみましょう。で、大きな注意点があります。これはFrindlyとしてもあくまで公式な使い方ではありません。用法容量を正しく守り、作者に感謝の意を表し、足を向けて寝ないように気をつけましょう。

電卓とメモ帳操作Friendly

ではFriendlyを使って同様に操作してみましょう。

ポイントは2つあって、時間による待機がないこと、そしてクリップボードを使わなくても値を取得設定していることです。クリップボードだとコピーしてペーストするまでの間に書き変わってしまう可能性もあります。そして時間で待たないことで失敗がない上に最速で動かすことが出来ます。

自動化はなるべく正当な方法で

このような感じでFriendlyを使えば、本来操作出来ない、出来たとしても成功確率が100%にならないアプリでもかなり確実性が高く操作出来るようになります。でも、Friendlyは最終兵器です。最終兵器は最後にそびえているからこそ意味があるのであって、通常は使わないにこしたことはないのです。


当たり前ですが、アプリの操作はアプリが用意している方法でやるのが正確で確実です。そのアプリで操作出来ないかをキチンと調べてください。まずは何よりそのアプリのマニュアルを読んでください。コマンドラインで叩いてみると分かることもあります。ネットも活用しましょう。

電卓とメモ帳を使わない操作C#

アプリが対応していないなら仕様やアプリを変更して自動化出来ないか考えましょう。計算してその結果をメモ帳に貼る操作であれば、電卓でなくてもExcelを使えばキーボードエミュレーションなしに操作できます。というか今回のケースであればC#で1行で書けます。

最後に

自動化はほとんどの場合結果さえ出せれば途中の工程がどうやっていても問題になりません。仕様を考えて、アプリを正しく把握して、それでもダメな時にはFriendlyを使いましょう。これで素晴らしい自動化ライフが待っていると思います。目指せノークリックオペレーション!明日はいよいよFriendly Advent Calendar2014ラストデーです!