2016-09-13 21 views
2

私はユーザーのID、名前、電子メール、およびユーザー名を一覧表示するユーザーテーブルを持っています。私がしようとしているのは、特定のエントリがそのテーブルにあることを確認することです。capybaraを使用してテーブル内の特定の行を見つける

本質的にはID = 22の行を見つけ、name = John Smithemail = [email protected]およびusername = jsmithを確認してください。以下のように設定することができます。私が理解できないことはいくつかあります...

  1. どのようにして特定のテキスト、I.E.つまり、user.id = 22となります。
  2. 私はその行を取得したら、どのように使用するのですか?各要素を取得します。

私は一種のforループを実行できると思っていましたが、has_selector?の条件を設定する方法がわかりません。 (以下で擬似コード)

page.all('tr').each do |tr| 
    next unless tr.has_selector?('td.id = 22') #psuedocode 

    expect(tr.get('td.name').to eq("John Smith") 
    #other expects here... 
end 

表コード

<table class="table table-striped table-condensed"> 
    <thead> 
    <tr> 
     <th>ID</th> 
     <th>Name</th> 
     <th>Email</th> 
     <th>Username</th> 
    </tr> 
    </thead> 
    <tbody> 
    <% @users.each do |user| %> 
     <tr> 
     <td class="id"><%= user.id %></td> 
     <td class="name"><%= link_to user.name, user %></td> 
     <td class="email"><%= user.base_name %></td> 
     <td class="username"><%= user.username %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

答えて

4

素敵なきれいなアプローチは、「データ - を追加することですuser-id "属性を各tr要素に追加し、tr = find('tr[data-user-id="22"]')で行を探しますが、これがオプションでない場合は、これを行う方法がいくつかあります。

td = page.find(:css, 'td.id', text: /^22$/) # find the id td with text of exactly 22 
tr = td.find(:xpath, './parent::tr') # get the parent tr of the td 
expect(tr).to have_css('td.name', text: 'John Smith') 

または

tr = page.find(:xpath, ".//tr[./td[@class='id'][text()='22']]") 
expect(tr).to have_css('td.name', text: 'John Smith') 

のようなだけでXPathを使用して行を見つけるのどちらかは、あなたが欲しいものを行う必要があります。あなたがループアプローチに固執したい場合(それが遅くなりますのでお勧めできません - そして、あなたのループはそれだけでは何も確認できませんでした構成されている方法)、それは何があるので、これは動作しませんしません

page.all('tr').each do |tr| 
    next unless tr.has_css?('td.id', text: /^22$/) 
    expect(tr).to have_css('td.name', text: "John Smith") 
    #other expects here... 
end 
0

これはなぜ?:のように単にない

feature "index users" do 
    let!(:user) { create(:user, name: "John Smith") } 

    it "shows users" do 
    visit users_path 
    within ".name_#{user.id}" do 
     expect(page).to have_content("John Smith") 
    end 
    end 
end 
+0

だろう"name _#{user.id}"のクラスを持つ要素です。 –

+0

私は知っていますが、 'td class =" name _ <%= user.id%> "'のように記述することもできます。また、ユーザーインスタンスが1つだけの場合も同様です。 –

+0

クラスにユーザーIDを追加するだけで、htmlに追加すると行のデータ属性にする必要があります。 –

関連する問題