4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iCAREAdvent Calendar 2020

Day 12

Feature Spec Tips集

Last updated at Posted at 2020-12-11

本エントリは iCARE Advent Calendar 2020 の12日目です。

はじめに

今回は Carely の開発を行う中で書いた Feature Spec の小技を紹介したいと思います

1,プログラムの一時停止

Feature Specを書いていると、何らかの処理が終わるまでプログラムの実行を停止させたいケースが出てくると思います。

sleep で停止させることもできますが、指定した時間は必ず停止してしまうので「処理は終わっているのにプログラムは停止している」という望ましくない状況になる可能性があります。数が増えるほど影響は大きくなってくるので、不要に時間をかけるのは極力避けたいところです。

そこで以下の2つの方法を使いました

① findメソッドを使う

capybaraの find というメソッドの ドキュメント を見てみると以下の記述があります

If the driver is capable of executing JavaScript, this method will wait for a set amount of time and continuously retry finding the element until either the element is found or the time expires. The length of time this method will wait is controlled through default_max_wait_time.

訳すと「ドライバがJavaScriptを実行できる場合、設定された時間のあいだ要素が見つかるか時間切れになるまで継続的に再試行します。このメソッドが待つ時間の長さは default_max_wait_time で制御されます」という意味になります

例として「タスクを新規作成したあと画面遷移してflashメッセージが表示される」というケースの場合、以下のように書くとflashメッセージが見つかる or 設定時間が経過するまで検索を行います

find("p#notice", text: "Task was successfully created.")

default_max_wait_time のデフォルト値は2秒ですが、設定で変更したり
以下のように個別に指定することもできます。

find("p#notice", text: "Task was successfully created.", wait: 30)

注意点

遷移前、遷移後両方に表示されている要素は指定しないようにしましょう。
遷移前の段階で要素が見つかり処理が進んでしまいます

② Timeoutモジュールを使う

要素の有無によって確認できない時はfindを使えません。その場合はRubyの Timeout モジュールを使うと「設定時間の間で処理が終われば即、次の処理に移る or 時間切れで例外となる」動きを実現できます

以下に「ファイルダウンロードされるまで待ちたいケース」のサンプルコードを置いておきます

Timeout.timeout(5) do
  loop { break if file_downloaded? }
end

2,新しいタブにアクセス

target="_blank" 属性がついているリンクをクリックすると別タブで展開されます。
新しいタブの動作を確認したい場合 capybaraでは switch_to_window でタブを切り替えることができます

switch_to_window(windows.last)

3,親要素にアクセス

select要素を指定したかったのですが、特定のidなどが無かったので以下のような順で指定しました
selectの兄弟要素であるlabelを指定 -> xpathを使って親要素を指定 -> 配下のselectタグを指定
xpathで親要素を参照できる。というのがもしかしたら誰かの役に立つかも?と思い書きました

find("label", text: "アタリがつけられるラベル名").find(:xpath, '..').find("select")

まとめ

「プログラムの一時停止」の割合が大きくなってしまいましたが、Feature Spec の小技を紹介させていただきました
どなたかの助けになれたら幸いです!

iCAREテックブログもよろしくね!!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?