robotframeworkとは
テスト自動化ができるフレームワーク。
簡単にいえば、「○○をクリックする」「画面が表示されるまで2秒まってからタブ遷移する」みたいな形で命令を書くと、ブラウザが立ち上がって命令通りに操作を実行し、異常がないかをテストしてくれるもの。
RailsのRspec+capybaraと感覚は似ている。
使用用途
自分はリグレッションテストの一環で実施している。コマンドを叩くだけでテストアカウント作成〜表示・削除までを実行してくれるので、1度書いてさえしまえばかなりテストが楽になる。
(複雑なテストパターンであればあるほど効果が実感できると思う。)
なぜこれをまとめるか。
比較的新しめのフレームワークということもあり、日本語での実例集の数が少ないので、詰まった点やこういう時どう切り抜けるか?というかなり実践的なポイントをまとめてみた。
(※robotframeworkのそもそもの基本的な機能は後日まとめてみたい。)
実施環境
windows10
robotframework3.0
seleniumlibrary(2の後のバージョン)
python 3.0
主な使用ライブラリ:builtIn,string,seleniumlibrary
新しいタブを開き、開いたタブ先でテストを続行したい。
target=”_blank”とかのリンクを押すと別タブが開くが、robotframeworkの処理は開いた先のタブではなく、元のタブでそのまま処理を継続させようとする。(そしてテストがエラーになる。)
それを防ぐために、以下を実行する。
// 開いているタブ名を取得
Get Window Names
// 上記で取得した遷移先のタブ名(=locator)を指定
Select Window name=locator
これで開いたタブに移動し、処理は開いたタブ上で始まる。
なお、たまにnameが一緒なタブ(undefinedとか)もあるので、そういう時は
// 開いているタブ名を取得
Get Window Titles
// 上記で取得した遷移先のタブ名(=locator)を指定
Select Window title=locator
でいけることもある。なお、もちろんnameやtitileを取得したらGet Window
は不要なので消してok。
locatorをidや一意のclassで指定してクリックさせたいのに、エレメントがnot foundと言われる
これもよく起きる。対策としてClickの前に
Wait Until Element Is Enabled エレメント名
Click Element id=エレメント名
とする。ポイントはWait Untilで有効化するまで待つこと。
それか、xpathで指定するとうまくいくケースもある。
Wait Until Element Is Enabled xpath: エレメントのxpath
Click Element xpath: エレメントのxpath
実感としては、読み込みに時間がかかるページ内のエレメントを指定した時や、ダイアログが表示されOKボタンを押したい時みたいな場合によくこの種のエラーに遭遇した。
if文で条件がtrueの時に処理を実行する
ここが1番詰まった。何せ日本語でif文の書き方的な情報が圧倒的にない。
ここでは実例として、「ページ内にqiitaという文言があれば<div id="test">
をクリックしてページをリロード、なければ普通にページをリロード」という条件文を書く。
// Run Keyword And Return Status: 後続のキーワードを実行し、結果を返す
// Page Should Contain Text: ページ内に指定のテキストが含まれているか
${result} = Run Keyword And Return Status Page Should Contain Text qiita
Run Keyword If '${result}' == 'True' Run Keywords Click Element test AND Reload Page ELSE Reload Page
ポイントは4つあって、1つはRun Keyword And Return Status
で成否をとりたいキーワードを指定してあげ、それを${result}という変数に入れること。
2つ目は${result}の中身とTrue
という文字列をRun Keyword If
で比較してあげること。
3つ目は'${result} == 'True'
とシングルクォートで変数も文字列も囲う必要があること。
最後に、ELSEは必ず大文字で書くこと。
これを実現するのにとても時間がかかった・・。なお、Run Keywords AND
は、ANDでつなぐことでいくらでも後ろにキーワードを追加できる。
もしこういう場合にもっといい書き方があればコメントください。
タブを閉じて、そのまま処理を実行させようとするとwindowがすでにクローズされていますというエラーが出る
例えば何かの処理を終えてタブを閉じ、すでに開いていたタブで継続の処理を走らせたい時に、そのままclose後に処理を続けようとするとエラーが起きる。そういう場合は
// タブがクローズしてしまう処理と仮定
Click Element quit
// 処理を続行したいタブ名(=locator)を指定
Select Window name=locator
と一度タブ名を指定すればOK。
最後に
robotframeworkは使いこなせれば便利だけど、いかんせん日本語の情報量が少ないので、こういう時どうすればいいんだろう?というのがわかりづらいのが現状だと思う。
これからもrobotframeworkは触っていく予定なので、随時アップデートしていきたい。