web-dev-qa-db-ja.com

Rails 3?

私が持っているビューファイルには:

= link_to 'View', post
= link_to 'View', comment

Specファイル(私はCapybaraを使用しています):

click_on 'View'

最初のリンクをクリックしますが、2番目のリンクをクリックしてください。どうすればできますか?

34

おそらくいくつかの方法がありますが、私は通常、このようなものをスコープします。

within(".comment") do
  click_on("View")
end

同様に、おそらく/おそらく別の選択肢もあります。私は通常、キュウリから受け入れテストを行うので、私の手順は通常次のようになります

When I follow "View" within the comment element

within the comment elementをステップ自体へのスコープ付き呼び出しに変換するステップがある場合(最新のcapybara web_stepsに組み込まれていると思います)

37
karmajunkie

すべてのエントリを見つけて、配列を処理しようとすることができます。

page.all('a')[1].click

クラスを持つか、またはwithinを使用して検索範囲を限定すると役立ちます;)

56

このタイプの問題を解決するには多くの方法があります。
このようにします

if(page.find("a")[:href] == "comment")
    click_on("View")

または

page.find("a:eq(2)").click

Javaのインデックス作成は0から始まり、Capybaraでは、インデックス作成は1から始まることを忘れないでください。 2番目のhrefにはa:eq(2)を使用してください。

15
RohitPorwal

「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ブロックでリンクを指定することはこれを行う良い方法です。

15
installero

_capybara 2_ソリューションの場合:

_within(".comment") do
  click_on("View")
end
_

少数の_.comment_がある場合は役に立ちません。簡単な使用法:page.first(:link, "View").click

7

これは、同じクラスの複数の行があり、2番目の行を検索する場合に役立ちます。前述の以前の著者のように、カピバラのインデックス作成は1から始まります。

within all(".trip-row")[2] do
   assert page.has_content?("content")
end
2
Jwan622

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
1
steel