情シスは何度でも甦るさ。

VBA!VBA!

Oracle Functional TestingをSeleniumで置き換える2

Web操作をseleniumで自動化してしまおうシリーズ。
もはや、Oracle Functional Testing関係無くなってきてますが。

第一回Oracle Functional Testing OpenScriptとは
第二回OpenScriptでスクリプト作成
第三回OpenScriptをJenkinsから呼ぶ
第四回Oracle Functional Testing OpenScriptで定常作業を自動化する
第五回Oracle Functional TestingをSeleniumで置き換える

前回は、Oracle Function TestingのデータバンクをSeleniumでやってみましたが、その際RubyからSelenium WebDriverを使って操作を行いました。
Rubyを使うと自由度は上がるが、やはり敷居が高い。
そこで、今回は、Selenium IDEのみでOracle Function Testingの代用になるようなケースについて考えてみる。


ユースケース
最近、自社であったケース。
あるシステムで、過去データがたまりまくっており、性能劣化やディスク容量を圧迫している。
今は、Webの管理画面から手作業で削除しているが、これに時間がかかる。
DBのデータを直接削除できたらいいが、パッケージを使ってるため、DBの内部構造には手が出せない。
メンバーのスキル面、およびスクリプトの実行するサーバの環境面を考えるとSelenium WebDriverを使うのは難しい(selenium用のサーバの調達がむずい)。
そこで、Webの管理画面の操作をSelenium IDEのみで自動化する。


【今のフロー】

  1. 手動でWebの管理画面を開き、データ一覧画面を開く
  2. 一覧画面には、登録日が古い順に、データが100件並ぶので、100件目のデータが5年前より古いかどうかを確認
  3. 古かったら、「全て選択」をチェックし、削除ボタンを押す
  4. 再度一覧画面を確認して、5年前のデータがなくなるまで削除を繰り返し


これを自動化するには、こんな機能が必要

  1. 5年前の日付を計算
  2. 画面から登録日を取得
  3. 5年前の日付と画面の登録日を比較して、画面の登録日が古いかどうかを判断
  4. 5年より過去の削除を繰り返す

Seleniumでこれを行う。
ここでは、社内のパッケージの画面は使えないので、代わりに一般的なページで、上記に似た操作を行う。


なお、Seleniumで条件分岐およびループをするには、Coreの拡張スクリプトを設定しないといけない。
公式ページ(英語)
日本語の説明ページ:http://iflaglabs.jp/original10.html



【サンプルシナリオ】
http://connpass.com/の今月の公開日のページが何ページあるか調べる

  1. 今月の1日の日付を計算
  2. イベント一覧の一番下のイベントの公開日を取得
  3. 公開日が今月かを判断し、公開日が今月なら次のページへ
  4. 公開日が先月以前なら、処理ストップ
  5. 最後に何ページ遷移したか、表示する

なわけで、作ってみた。
ソース


以下、簡単に補足

open /explore  
storeEval 1 pageCount
storeEval var date = new Date();Date.parse(date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + 1); thisMonthDate
storeText //div[@id='main']/div/div[10]/div/div/p[2] createDateContent
storeEval storedVars["createDateContent"].match(/\d{4}\/\d{2}\/\d{2}/); createDateString
storeEval Date.parse(storedVars["createDateString"]); createDate
while storedVars["createDate"] > storedVars["thisMonthDate"]  
storeText //div[@id='main']/div/div[10]/div/div/p[2] createDateContent
storeEval storedVars["createDateContent"].match(/\d{4}\/\d{2}\/\d{2}/); createDateString
storeEval Date.parse(storedVars["createDateString"]); createDate
echo ${createDate} + " vs " + ${thisMonthDate}  
clickAndWait link=次へ>>  
getEval storedVars["pageCount"]++;  
endWhile    
getEval alert("finished. pageCount = " + ${pageCount});  


2行目storeEval で変数に1をセット
3行目storeEvalは、Javascriptのコードがかけるので、今月1日を日付型にして、変数にセット
4行目storeTextで、DOMツリーで、画面のテキストを変数にセット
5行目は、セットした画面のテキストを正規表現で、日付項目だけを抽出し、変数にセット(日付以外の日本語も混ざっているため)
6行目で、その日付を日付型に変換
7行目から、アドオンのwhile変数で、ループを回して、登録日が今月の間は、ページングを繰り返す。


という感じで、条件分岐と繰り返しのある自動操作ができるようになりました。

感想としては、Selenium上でJavascriptのコードが書けるので、結構色んな事ができるのがわかった。
あと、画面の項目の取得は、Oracle Functional Testingより簡単だった。
データバンクは、Selenium IDEだけだとやっぱキツいけど。画面のデータを使って条件分岐して操作するっていうのは、ほぼできそう。
あとは、seleniumはコマンドで起動とかもできるので、(Javaselenium serverのjarファイルが必要)OSのスケジュールでキックすればバッチ処理としてもできる。
Jenkinsから呼ぶようにしとくと何かと便利ですけどね。それはこちらを参考。第三回OpenScriptをJenkinsから呼ぶ