hirax.net::Keywords::「自動化」のブログ



2008-11-15[n年前へ]

Ruby版 Win32GuiTest クラスを作りました。 

 (この記事の続きが「続:Ruby版 Win32GuiTest クラスを作りました。」)になります。

 Ruby版 Win32GuiTest クラスを作りました。PerlのPerlのWin32-GuiTestと同じような機能を集めたものです。つまり、MoonWolf さんのWin32::GuiTestと同じようなものです。

 夕方からPerlのWin32::GuiTestの関数リストを見て、それと同じようなものををつらつら書いていき、私自身が使いそうにない関数・機能が続き始めた辺りでやる気が下がってきたので、とりあえずソースコード(guiTest.rb)をここに置いておくことにします

 (コードにも入っていますが)サンプルコードは下記のようになります。これは、「ワードパッドを立ち上げて、ウィンドーを全面に持ってきて、適当に文字を入力して、その文字をコピーして数回ペーストした後に、保存せずに終了する」という具合に動きます('RichEdit20W'の部分は、クラス名からの子ウィンドゥ検索を示すために入れたので、実際にはなくても構わない部分だと思います)。

  gui=Win32GuiTest.new
  gui.run('wordpad.exe')
  sleep 2
  gui.setForegroundWindow(
    gui.findWindowLikeName('ワードパッド').first[0] )
  gui.setFocus( 
    gui.findWindowLikeClass('RichEdit20W').first[0] )
  gui.sendKeys('This is a sample.{ENTER}',1)
  gui.sendKeys('^a^c')
  5.times do |i|
     gui.sendKeys("#{i} ...{ENTER}")    
     gui.sendKeys('^v')    
  end
  gui.sendKeys('%f',2)    
  gui.sendKeys('x',1)    
  gui.sendKeys('n',1)
 VMware上で作業をしていることもあり、動作未確認の部分(マウス操作・ホイール操作)もあるのですが、「キーボード・マウス・ウィンドウを操作する」というGUIの基本三点セット処理にはそこそこ使える・・・と良いな、と思っています。

DLWin32API






2008-11-16[n年前へ]

続:Ruby版 Win32GuiTest クラスを作りました。 

 (この記事は「Ruby版 Win32GuiTest クラスを作りました。」)の続きです。

  Ruby版 Win32GuiTest に関数・機能を追加しました。下の動画は「ペイントを立ち上げて、ウィンドウの場所を動かし、絵を描いた上で、ビットマップファイルを保存する」という作業をRuby版 Win32GuiTestを使ってRubyで自動で行ったものになります。


 実際のコードはソースコード(guiTest.rb)に入っているように、下記のようになります。次はリサージュ図形でも書いてみることにしましょうか。

  gui=Win32GuiTest.new
  gui.run('mspaint.exe')
  sleep 1
  w=gui.findWindowLikeName('ペイント').first[0]
  gui.setForegroundWindow(w)
  gui.moveWindow(w)
  r=gui.getWindowRect(gui.getForegroundWindow)
  sleep 1
  360.times do |i|
    rad=i*2*3.14/360.0
    x=r[0]+200+100*Math.cos(rad)
    y=r[1]+200+100*Math.sin(rad)
    gui.mouseMoveAbsPix(x.to_i,y.to_i)
    gui.sendLButtonDown if i==0
  end  
  gui.sendLButtonUp
  gui.sendKeys('%f',2)    
  gui.sendKeys('x',1)    
  gui.sendKeys('y',1)    
  gui.sendKeys('TestBitmap.bmp',2)    
  gui.sendKeys('{ENTER}',2)    

ペイント automated by Ruby Win32::GuiTest 

 というわけで、リサージュ図形(もどき)を「ペイント automated by Ruby Win32::GuiTest」で描いてみました。ペイントソフトでリサージュを(マウスを使って)描くのは大変ですけど、自動化すれば簡単ですよね。・・・簡単・・・ですよね・・・?


2008-12-01[n年前へ]

「Windows操作を再現するPerlスクリプト」を自動で作る"Win32GuiTest.exe" 

 PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を、ppmからインストールするのではなくてWin32-GuiTest-1.56.tar.gzとしてダウンロードしてみると、"Win32-GuiTest Recorder"というwindows アプリケーションが付属していることに気づきました。

 "Win32-GuiTest Recorder"が行う動作を「ひとこと」で言ってしまえば、「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作をPerlのソースコードとして保存してくれる」というものです。たとえば、「( "Win32-GuiTest Recorder" の)"Record"ボタンを押し、適当にキーボードとマウス作業をしてから、"Stop"ボタンを押す」と、こういったPerlソースコードが自動作成されます。

#!/usr/bin/perl
use Win32::GuiTest qw/:ALL/;
$Win32::GuiTest::debug = 0;

MouseMoveAbsPix(303, 484);
SendMouse('{LEFTCLICK}');
SendKeys('{ENT}test{ENT}');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY);
SendKeys('s');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY | 
  KEYEVENTF_KEYUP);
MouseMoveAbsPix(169, 484);
SendMouse('{LEFTCLICK}');
SendKeys('{BAC}{ENT}');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY);
SendKeys('s');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY | 
  KEYEVENTF_KEYUP);
 

ソースを眺めてみれば、結局、Windows操作を、MouseMoveAbsPix と SendMouse と SendKeys と SendRawKey として記録するだけになります。しかし、Windows上の操作を一回するだけで、スクリプトが自動生成されるというのは、とても便利です。しかも、マウスイベントとキーボードイベントだけを記録するだけでなくて、起動時に表示されるダイアログで"Windows Hint"オプションを付けておけば、「操作を行ったWindowの名前やクラス」を(ソースコード内にコメントとして)記録しておいてくれるのです。これは、後からfindWindowなどを使った処理に変える際に非常に便利です。Windowのクラスや名前を自動で記録しておいてもらえると、たとえば、(画面サイズが異なる他の人のPCで動くように)後でPerlスクリプトを修正したりする作業が実に簡単になります。

 単純作業をスクリプトで書く場合には、ソースコードをゼロから書き始めるよりは、叩き台・スケルトンからスタートする方が「とっつきやすい」ものです。もちろん、「とっつきやすい」コースが最終的に楽なコースかどうかは場合によりけりだと思いますが、いじり始める叩き台が自動的に作ってくれるツールというのは、とても便利なものだと思います。

2008-12-02[n年前へ]

"Win32GuiTest.exe"で「Windows操作を再現するRubyスクリプト」を自動で作る 

 PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を Ruby に移植した Win32GuiTest クラスをバージョンアップし win32GuiTest.rb として、ここに置きました)。変更点の一つめは、"pushButton" ""pushChildButton" "sendMessage" "postMessage" "getTopWindow" といった関数を増やしたことです。

 そして、もう一つが「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作を Perlのソースコードとして保存してくれる」"Win32-GuiTest Recorder"(ここに Recorder.lzh としてコピーを置いておきます)が出力したPerlのソースコードをRubyスクリプトに変更する処理を、クラスメソッドとして実装したことです。たとえば、

require 'win32GuiTest'
Win32GuiTest.convertPerlScript("pl.pl")
といったコードを書けば、"Win32-GuiTest Recorder"が出力したPerlスクリプト"pl.pl"をもとに、Rubyスクリプトが出力されます。(たとえば、pl.plを変換した結果がpl2rb.rbになります)。

 これで、PerlユーザだけでなくRubyユーザも(とはいえ、きっとPerlを使うことができる人はRubyも使うことができるだろうし、Rubyを使うことができる人はPerlも使えるだろう・・・と思っているのですが)、"Win32-GuiTest Recorder"を使ったWindows 操作のスクリプト自動生成のありがたみを味わえる、ということになります。

 ちなみに、"Win32-GuiTest Recorder"の設定は、ダイアログのチェックボタンを下に示したスクリーンショットのように(とりあえずは)ユーザが処理した待ち時間やウィンドー情報を保持しておくのと、後で便利でお勧めです。



■Powered by yagm.net