3

我的应用程序中有一张桌子。

在此处输入图像描述

使用 Capybara 和 Cucumber,我如何断言值 4.5 和 1.1 仅发生在 Mike 的行中?
在 Capybara 中可以这样断言吗?

谢谢!

4

2 回答 2

5

您可以要搜索特定值的范围内使用:

例如,要断言值 4.5 发生在 Mike 行的第二列,请尝试以下操作:

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

希望您会发现其中一种技术对您正在尝试做的事情有用。

于 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

这是可用于测试的完整脚本

更新:我想多了。上面的代码会很慢,因为每次调用findtextintd_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 毫秒,而第二个变体 - 8 毫秒。好优化!

于 2013-01-25T20:52:07.323 回答