2012年11月18日日曜日

[自動化][UWSC] UWSCを使ってWebテスト・Web作業の自動化(のはじめの一歩)

UWSCというツールを使って、この前初めてGUIテストの省力化スクリプトに挑戦しました。

このUWSCというのは、WindowsのGUI操作をスクリプトで記述することができ、
色んなオペレーションが自動化、省力化できるいい奴です。
VBAとバッチとPowerShellをひとまとめにして扱いやすくひとつの言語にしたみたいな、
大雑把にいうとそういうものです。
結構前からあるようなので、知ってる人からすると「うわーなついwww」みたいなところもあると思います。でもバッチリWindows 7 対応してて、良い感じです(多分)




で、どんなスクリプトを作ったかと言うと…具体的には、IEを開いて、決まったURLへアクセスし、アクセス完了後の画面をキャプチャし、Excelのシートに貼り付けるというものです。
URLはテキストでリストを作っておきます。フツーに1行に1個、アクセスしたいURLを書いておくだけです。

フローとしてはこんな感じ。

はじめ
IEとExcelを開いておく
用意しておいたURLから1行を拾う
(ここからループ)
IEをアクティブウィンドウにする
新しいタブを開いてURLを流し込む
Enterキーを押してアクセス
ページが開ききったらPrintScreen
Excelをアクティブウィンドウにする
貼り付ける
新しいシートを作る
(ここまでループ)
URLリストを閉じる
おわり



スクリプトはこんな感じ。
[ autoSitesViewing.uws ]
====================================================================

STOPFORM(False)     // Stopウィンドウは出さない

//パスなどの設定-------------------------------------------------------
//入力ファイル(URLリスト)のパスを指定
inputFilePath = "C:\Users\HogeHoge\Desktop\uwsc48c\URLList.txt"
// Excelのパス
excelPath = "C:\Program Files (x86)\Microsoft Office\Office12\excel.exe"
// IEのパス
iePath = "C:\Program Files\Internet Explorer\iexplore.exe"
//-----------------------------------------------------------------

//起動処理----------------------------------------------------------
// Excel起動
excel = EXEC(excelPath)
// 起動完了まで待つ(10秒以内想定)
sleep(10)
// ExcelのIDを取得
excel_id = GETID(GET_ACTIVE_WIN)

// IE起動
ie = EXEC(iePath)
// 起動完了まで待つ(10秒以内想定)
sleep(10)
// IEのIDを取得
ie_id = GETID(GET_ACTIVE_WIN)
//-----------------------------------------------------------------

//URLリストファイルを開く
txt_id = FOPEN(inputFilePath, F_READ)
//入力ファイルの行数を確認
rowNumOfFile = FGET(txt_id,-1)

//i行目を1行分だけ読むループで全部のURLを1行ずつ取得する
For i = 1 to rowNumOfFile
// URLの読み込み
bufferString = FGET(txt_id,i)
// IEをアクティブウィンドウに設定
acw(ie_id)
// 新しいタブを作る
CLKITEM(ie_id, "新しいタブ (Ctrl+T)")
//タブを作りきるまでスリープ(3秒想定)
sleep(3)
// アドレスバーにURLを入力
SENDSTR(ie_id, bufferString)
// Enterを押してサイトへアクセス
kbd(vk_enter,click,0)
// サイトの表示完了を待つ(10秒想定)
sleep(10)
// PrintScreenボタンを押す
sckey(0,VK_SNAPSHOT)
// Excelをアクティブウィンドウに設定
acw(excel_id)
// 貼りつけ
SCKEY(0, VK_CTRL, V)
// 次のURL用のワークシートの挿入
kbd(vk_shift,down,1000)
kbd(vk_f11,click,0)
kbd(vk_shift,up,10)
next

//読み込んだファイルのクローズ
FCLOSE(txt_id)

====================================================================


アクセスしたいサイトはこんなかんじでテキストファイルに羅列しておきます。

[ URLList.txt ]
====================================================================
http://www.takamagahara.com/printin/
http://jp.wsj.com/
http://www.nintendo.co.jp/
http://ja.wikipedia.org/wiki/%E5%AD%A6%E5%8A%9B
https://www.google.co.jp/search?hl=ja&lr=lang_ja&q=%E5%B3%B0%E3%81%AA%E3%82%86%E3%81%8B&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&bpcl=38625945&biw=1366&bih=643&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=8amoUPi1CePqmAWes4HoBQ
http://www.microsoft.com/ja-jp/default.aspx
====================================================================

以下に自分用Tipsメモ

■よく考えれば当たり前な気がするけど、IEやOfficeはバージョンによってフルパスが異なるから、実行環境を確認しておくこと

■参考にしようとサイトググってると、Exec関数でプログラムを開いた戻り値がそのプログラムのIDとして使えるように見えるけど、なんかうまくいかなかったので、「GETID(GET_ACTIVE_WIN)」を使ってその時のアクティブウィンドウのIDを取得している

■キーボード操作はsckey()かkbd()で行う。その時に「どのキーボードを押すか」は専用の定数を使う。定数は「vk_hoge」の形で定義されている

■キーボードは押しっぱなし(Down)、ぽちっと押す(Click)、押しっぱなし解除(Up)がある。それぞれ待ち時間も指定できる

■clkitem()を使うと、今アクティブなウィンドウに対して「hogehogeをクリックして、それからfugafugaをクリックして」みたいな挙動が書ける。

■clkitem()で具体的な項目をクリックさせるにはそのアイテム名(名前)が必要。たとえば上記スクリプト内で、IEの新規タブ作成ボタンをクリックさせるために「"新しいタブ (Ctrl+T)"」というのを記述している。これはIE9がそのボタンに対して「新しいタブ (Ctrl+T)」という名前を定義しているからである。

■それはつまり、項目の名前が変わるとスクリプトを書き換えなきゃいけないということであり、名前が定義されていないものはclkitem()でクリックできないことになる。

■ではそのウィンドウのアイテムがどんな名前になっているかはどうやって調べればいいかというと、それはすでに偉大な先人がいて、ここに書いてあるスクリプトを実行してウィンドウパラメータを取得すると、バーっと名前が出てくるので、それを使う。数字とかじゃなくて本当に文字列な名前を使う。

■独自関数化(Function)できる

■テキストを入力できる状態ならsendstr()を使うと長い文字列もババっと入力できる


こんなところかな…。


これを取り扱った本もあるんですね。
評価が良くないのでアフィは張りませんが…。

短時間化できるものはドンドンやって、時間を作りたいものですね。
それだけのアイデアと実装力が必要ではありますが…精進精進。