web-dev-qa-db-ja.com

Ruby内のhtmlテーブル行の数をカピバラ+キュウリを使用してアサートする方法

Ruby cucumber + capybaraを使用して)BDD Web開発を理解しようとしていますが、テーブルの行数を確認するだけの簡単なタスクで立ち往生しています。私が達成しようとしていることの意図は、次のようなものです:

page.should have_xpath("//table[@id='myTable']")
find("//table[@id='myTable']/tr").length.should == 3

しかし、これは機能せず(メソッドの長さが欠落)、テーブルの長さに対してアサートする方法を見つけることができません。

誰でもどんなアイデアでも(私には簡単にしてください、私はRuby nooby)です)

前もって感謝します

ニール

38
Neil

私はこれで最後に行きました:

Then /^I should see "(.*)" once$/ do |text|
    within_table('myTable') do
      should have_xpath("//tr", :text => text, :count => 1)
    end
end

それは適切にエレガントに見えました。

私は他の答えが機能することを理解していますが、これはよく読んでいるようです。

コメントは?

3
Neil

たとえ have_css?はトリックを実行します。テストは、いくつかの条件が真であると想定され、それが偽であったと単に言うのではなく、それらがどのように失敗したかを伝える必要があります。これを念頭に置いて、以下の最初の例は2番目の例よりも読みやすくなっています。

# IF FAILED => "expected 10, got 7"
page.all('table#myTable tr').count.should == 10

# IF FAILED => "expected true, got false"
page.should have_css("table#myTable tr", :count=>10)
58
andersonvom

私はこれを行うことができると思います:

page.should have_css("table#mytable tr", :count=>3)
20
AlistairH

何らかの理由で「has_css」は機能しませんが、「all(selector)」は本当にうまく機能します

all("table#movies tr").count
13
Anton

メソッド#findは1つの要素のみを返します(複数の一致がある場合、最初の要素を返すと思います)。#findの結果はNodeであるため、#lengthメソッドを取得しません。 =配列ではありません。

これを自分で証明するには、

puts find("//table[@id='myTable']/tr").class

必要なのは#allです。これにより、一致するすべてのノードの配列が返されます。

1
mattwynne

このようにして、htmlテーブルの行数を知ることができます。

area = find_by_id('#areaID').all('tr').size

テーブルの最初に列があると仮定します。この方法で実際の数に到達できます。

area = area-1
0
Ferhat