私が持っているビューファイルには:
= link_to 'View', post
= link_to 'View', comment
Specファイル(私はCapybaraを使用しています):
click_on 'View'
最初のリンクをクリックしますが、2番目のリンクをクリックしてください。どうすればできますか?
おそらくいくつかの方法がありますが、私は通常、このようなものをスコープします。
within(".comment") do
click_on("View")
end
同様に、おそらく/おそらく別の選択肢もあります。私は通常、キュウリから受け入れテストを行うので、私の手順は通常次のようになります
When I follow "View" within the comment element
within the comment element
をステップ自体へのスコープ付き呼び出しに変換するステップがある場合(最新のcapybara web_stepsに組み込まれていると思います)
すべてのエントリを見つけて、配列を処理しようとすることができます。
page.all('a')[1].click
クラスを持つか、またはwithinを使用して検索範囲を限定すると役立ちます;)
このタイプの問題を解決するには多くの方法があります。
このようにします
if(page.find("a")[:href] == "comment")
click_on("View")
または
page.find("a:eq(2)").click
Javaのインデックス作成は0から始まり、Capybaraでは、インデックス作成は1から始まることを忘れないでください。 2番目のhrefにはa:eq(2)を使用してください。
「2番目の」リンクの最悪な点は、いつか3番目または1番目、さらには25番目になる可能性があることです。したがって、within
ブロックを使用したスコープが最善の方法です。例:
within(".comment") do
click_on("View")
end
しかし、within
スコープでリンクを指定するのが難しい場合(実際にはそうなることがあります)、特定のテキストで2番目のリンクをクリックする方法は次のとおりです。
find(:xpath, "(//a[text()='View'])[2]").click
Capybaraの以降のバージョン(2.0.2
、たとえば)click_on 'View'とclick_link 'View'の両方は、あいまいな一致エラーを発生させます。
Failure/Error: click_on 'View'
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching link or button "View"
したがって、最初のリンクをクリックしたい場合(または、リンクが問題ない場合、これは私の場合です)でも実行されません。
私が理解している限り、これは特定のリンクがクリックされるより具体的なテストを書くことを人々に強制するために作られています。
誤って同一のテキストを含む2つ以上のリンクを配置して、何が起こっているのかを確認しようとすると、コードをデバッグするのは間違いなく難しいかもしれません。変更する可能性が低いものに依存するのは良いことであり、within
ブロックでリンクを指定することはこれを行う良い方法です。
_capybara 2
_ソリューションの場合:
_within(".comment") do
click_on("View")
end
_
少数の_.comment
_がある場合は役に立ちません。簡単な使用法:page.first(:link, "View").click
これは、同じクラスの複数の行があり、2番目の行を検索する場合に役立ちます。前述の以前の著者のように、カピバラのインデックス作成は1から始まります。
within all(".trip-row")[2] do
assert page.has_content?("content")
end
capybara-ui を使用すると、各ウィジェットにウィジェットまたは再利用可能なDOM参照を定義できます。
# define your widget. in this case,
# we're defining it in a role
widget :view_post, ['.post', text: 'View']
widget :view_comment, ['.comment', text: 'View']
# then click that widget in the test
role.click :view_post
role.click :view_comment