3

アプリにテーブルがあります。

ここに画像の説明を入力

Capybara と Cucumber を使用して、値 4.5 と 1.1 が Mike の行でのみ発生することをどのように主張しますか?
カピバラでそのような主張は可能ですか?

ありがとう!

4

2 に答える 2

5

withinを使用して、特定の値を検索する範囲を絞り込むことができます。

たとえば、値 4.5 が Mike の行の 2 列目に発生することをアサートするには、次のようにします。

within("table tr:nth-child(2)") do
  find("td:nth-child(2)").text.should == 4.5
end

必要に応じて、使いやすくするためにこれらをヘルパー メソッドでラップできます。

def within_row(num, &block)
  within("table tr:nth-child(#{num})", &block)
end

def column_text(num)
  find("td:nth-child(#{num})").text
end

次のようにして、Mike の行について同じアサーションを行うことができます。

within_row(2) do
  column_text(2).should == 4.1
end

うまくいけば、これらのテクニックの 1 つが、あなたがやろうとしていることに役立つと思います。

于 2013-01-25T19:45:50.437 に答える
3

はい、それは可能で簡単です:

def td_text(n)
  find(:xpath, "./td[#{n}]").text
end

h = {2 => 4.5, 3 => 1.1}

all('table tr').each do |row|
  within row do
    if td_text(1) == 'Mike'
      h.each { |i, value| td_text(i).should == value.to_s }
    else
      h.each { |i, value| td_text(i).should_not == value.to_s }
    end
  end
end

テストに使用できる完全なスクリプトは次のとおりです

更新:私はそれについてもっと考えました。上記のコードは、findおよびtextintd_textを呼び出すたびにブラウザに新しいクエリが作成されるため、非常に遅くなります。

それを軽減する唯一の方法は、JS と Nokogiri を使用することです。

source = page.evaluate_script("document.getElementsByTagName('table')[0].innerHTML")

doc = Nokogiri::HTML(source)

def td_text(row, n)
  row.xpath("./td[#{n}]").text
end

h = {2 => 4.5, 3 => 1.1}

doc.css('tr').each do |row|
  if td_text(row, 1) == 'Mike'
    h.each { |i, value| td_text(row, i).should == value.to_s }
  else
    h.each { |i, value| td_text(row, i).should_not == value.to_s }
  end
end

コードの最初のバリアントは私のマシンで約 200 ミリ秒実行されますが、2 番目のバリアントは 8 ミリ秒です。良い最適化!

于 2013-01-25T20:52:07.323 に答える