Ruby 如何在Watir中使用类名计算表行数?

Ruby 如何在Watir中使用类名计算表行数?,ruby,rspec,watir,watir-webdriver,Ruby,Rspec,Watir,Watir Webdriver,我想对类名为subjectField的所有表行进行计数,如果某行的类名为分隔符,则停止计数 HTML: 这对我不起作用。它说第6行的tr是未定义的方法 有人知道如何解决这个问题吗?问题1-检查行类 您正在传递tr参数,这就是Ruby认为它是一种方法的原因。在这种情况下,tr实际上是为循环的当前迭代选择的元素。要检查当前tr的class属性,elsif语句应为: elsif tr.class_name == "subjectField" 第2期-迭代行 请注意,您的线路也会出现问题: @f.di

我想对类名为
subjectField
的所有表行进行计数,如果某行的类名为
分隔符,则停止计数

HTML:

这对我不起作用。它说第6行的
tr
是未定义的方法


有人知道如何解决这个问题吗?

问题1-检查行类

您正在传递
tr
参数,这就是Ruby认为它是一种方法的原因。在这种情况下,
tr
实际上是为循环的当前迭代选择的元素。要检查当前tr的class属性,
elsif
语句应为:

elsif tr.class_name == "subjectField"
第2期-迭代行

请注意,您的线路也会出现问题:

@f.div(:id => 'household').table(:class => 'color_table').tbody.trs.find
find
方法将在trs中迭代,直到块的计算结果为true。由于该块的计算结果始终为true或break,因此只能得到0或1个主题。使用
每个

@f.div(:id => 'household').table(:class => 'color_table').tbody.trs.each
把它放在一起

将上述修复组合在一起,该方法可以写成:

def countRows
  @subjects = 0
  table = @f.div(:id => 'household').table(:class => 'color_table')
  table.tbody.trs.each do |tr|            
    break if tr.td(:class => "separator").exists? == true

    @subjects += 1 if tr.class_name == "subjectField"
  end         
  @subjects
end

我将这样做(未经测试的代码):


非常感谢。我对这个案子还有一个问题。问题是,当我使用“exists”时,它会从整个页面中搜索它,但我只需要在特定的“tr”中检查它。使用'if tr.td(:class=>“separator”)。是否存在?==true'我希望它检查某些tr是否有名为separator的类,如果没有,则转到下一个条件。代码
tr.td(:class=>“separator”).exists?
将只检查当前tr中是否存在td。您看到的问题是由于您迭代tr的方式造成的-应该是
每个
而不是
查找
@Seda,您确定这解决了您的问题吗?对于示例html,它返回4,我相信您想要3。take_while块假定分隔符单元格位于subjectField行内,这不是真的。是的,它返回了4。我认为问题在于,驱动程序试图在trs中用类“subjectField”找到分隔符类。他在那里找不到,这就是为什么返回值是4,而不是3。第一个答案更适合我的问题。不过还是要谢谢你的帮助!:)是的,对不起,我误解了原来的问题。我已编辑代码以正确工作:)
@f.div(:id => 'household').table(:class => 'color_table').tbody.trs.each
def countRows
  @subjects = 0
  table = @f.div(:id => 'household').table(:class => 'color_table')
  table.tbody.trs.each do |tr|            
    break if tr.td(:class => "separator").exists? == true

    @subjects += 1 if tr.class_name == "subjectField"
  end         
  @subjects
end
def count_rows
  @f.div(:id => 'household')
    .table(:class => 'color_table')
    .trs
    .take_while {|row| !row.td(:class => "separator").exists? }
    .select {|row| row.class_name =~ /subjectField/}
    .size
end