RSpec
とcapybara-webkit
を使用してテストを改善し、すべてのcss
とxpath
セレクターを削除しようとしています。
find('#edit_user > div:nth-child(7) > div > div > button').click
そして、私はそれらを交換するための最良のオプションを探しています。
要素のcss class
を使用するつもりでしたが、一部の「プロ」カピバラテスターは、これは最良のオプションではないと述べました。
だから私の質問は:テストでdata
attributesを使用できますか?
要素がある場合
<button name="button" type="submit" class="button last" data-test="edit.update">Update/button>
できますか
find('edit.update').click
?
そして、それは良い考えだと思いますか?このトピックに関するアイデアや情報がありましたら、お気軽にコメントしてください!
Data- *属性で要素を見つけるには、CSSセレクターまたはXPathを使用する必要があります。
CSSセレクターの場合:
find('button[data-test="edit.update"]').click
XPathの場合:
find('//button[@data-test="edit.update"]').click
良いアイデアであるかどうかは、実際にアプリケーションに依存します。要素を一意に識別するものを選択する必要があります。 「edit.update」が一意にならない場合、使用するのは良い選択ではありません。 class
属性は、ボタンに一意のクラスがあり、その「ボタン」と「最後の」はそうではない場合は問題ありません。
最良のアプローチは、ページ内で一意である必要があり、変更される可能性が低い静的id
属性を使用することです。 find
メソッドは、IDによる要素の検索もサポートしています。つまり、CSSセレクターやXPathを記述する必要はありません。
Justin Koの答えは正しいです。状況によってはテストを読みやすくするために、もう少し高度なものを追加したかっただけです。 Capybaraに独自の「セレクター」を追加できるので、データテスト属性(テストのためだけに属性を追加したくないので、あまり良い考えではありません)で本当に選択したい場合は、多くのことができます
Capybara.add_selector(:dt) do
css { |v| "*[data-test=#{v}]" }
end
許可するだろう
find(:dt, 'edit.update')
これにより、テストを理解しやすくすると同時に、複雑なCSSまたはパスクエリをテストコード内の1か所に制限できます。次に、次のようなメソッドを定義できます
def find_by_dt(value)
find(:dt, value)
end
find(:dt、...)よりもfind_by_dt ...の外観を好む場合
独自の選択にフィルターと説明を追加して、柔軟性を高めたり、エラーの説明を改善したりすることもできます- https://github.com/jnicklas/capybara/blob/master/lib/capybara/selector.rbを参照 capybaraが提供する組み込みセレクター