40

我正在尝试使用 cucumber + capybara 在 Ruby 中进行 BDD Web 开发,但我被困在应该是一件容易的事情上——只是检查表中的行数。我想要达到的目的是:

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

但这不起作用(缺少方法长度),我找不到针对表长度断言的方法。

任何想法任何人(请对我放轻松,我是红宝石小白)

提前致谢

尼尔

4

6 回答 6

61

即使have_css?可以解决问题,您的测试也应该告诉您它们是如何失败的,而不是仅仅说某些条件应该为真而它是假的。考虑到这一点,下面的第一个例子比第二个例子要好得多:

# 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)
于 2012-03-16T03:11:44.213 回答
20

我认为你可以这样做:

page.should have_css("table#mytable tr", :count=>3)
于 2010-06-30T22:29:22.187 回答
13

出于某种原因,“has_css”对我不起作用,但是“all(selector)”真的很好用

all("table#movies tr").count
于 2012-03-14T22:35:22.173 回答
3

我最终选择了这个:

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

这看起来非常优雅。

我意识到其他答案有效,但这似乎读得很好。

任何意见?

于 2010-07-12T22:57:58.297 回答
1

#find 方法仅返回一个元素(我认为如果有多个匹配项,它只会返回第一个元素),因此您不会得到 #length 方法,因为 #find 的结果是节点而不是数组。

为了向自己证明这一点,请尝试

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

你想要的是#all,它将返回一个包含所有匹配节点的数组。

于 2010-07-12T20:24:37.420 回答
1

这样就可以了解到html表格的行数了。

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

假设表的开头有列。这样就可以达到实际的数量。

area = area-1
于 2017-11-03T14:50:15.077 回答