Ruby 使用WATIR的表迭代

Ruby 使用WATIR的表迭代,ruby,watir,Ruby,Watir,我的页面中有一个表需要处理,为此我使用以下代码 b.table(:id,'something').rows.each_with_index do |row,index| puts row.cell(:index,1).text if index.eql?3 row.cell(:index,0).image.click end end 除非桌子收缩和膨胀,否则它可以正常工作。在我表格的第一列中有一个“加号”按钮,如果我点击该按钮,表格将展开,它将显示更多的

我的页面中有一个表需要处理,为此我使用以下代码

b.table(:id,'something').rows.each_with_index do |row,index|
    puts row.cell(:index,1).text
    if index.eql?3
        row.cell(:index,0).image.click
    end
end

除非桌子收缩和膨胀,否则它可以正常工作。在我表格的第一列中有一个“加号”按钮,如果我点击该按钮,表格将展开,它将显示更多的行数,一旦点击,它将变成“减号”,如果我再次点击该“减号”,它将再次缩小。我的问题是,如果通过单击加号按钮来展开表(如程序中所示,当索引达到3时单击该按钮),那么其余的行(从4行开始)将不会执行。至于我所知道的对象位置的变化,我想,为了得到所有的行,我需要再次执行'b.table(:id,'something').rows',这样新扩展的表就可以正常工作了,那么无论如何,我可以避免这个问题而不终止循环吗

一旦调用
b.table(:id,'something')。行
那么这些行已经是一个固定的ruby数组了。下面的任何东西都无法更改该数组,如果您试图在循环中更改该数组,ruby很可能会抱怨

所以你有两个选择:

  • 再次调用
    table.rows
  • 调用
    b.按钮(…)。单击
    ,然后只调用一次
    表。行
  • 希望这有帮助

    补充说明:不,不可能执行您想要的操作
    #行
    实际上返回
    Watir::ElementCollection
    #每个带有(u)索引的(u)调用
    #每个
    ,如果查看
    #每个
    源代码,您将看到:

    def each(&blk)
      to_a.each(&blk)
    end
    
    #to_a
    使用元素生成一个新的数组对象。基本上,您会得到一个行数组,并对其进行迭代。Watir幸运的是在页面更改时,不会试图聪明地从脚下更改您请求的阵列。在迭代数组时更改数组实际上是一个非常糟糕的主意。结果将是不可预测的。这就是为什么每次要查看当前页面状态时都需要调用
    表(…).rows


    不过,正如我所说的,没有必要遍历表来单击按钮。您可以通过
    xpath
    css
    直接访问它

    是的,我知道。这就是我正在做的,但我觉得每次表收缩和扩展时,我都必须调用b.table.rows.hi,您另外解释的内容我已经理解了,我知道它已被纳入数组,它不会在页面刷新时更改,但您在最后一行中解释的内容我不清楚,“尽管如此,正如我所说的,没有必要进行iter。。。。。。。。。。。。。。。。“你是说我们可以使用xpath指出某一行吗?@RAJ,我不知道如何使用xpath到达表中的特定单元格,但这应该是可能的。您还可以通过
    名称
    id
    文本
    或其他属性来访问按钮,避免处理表格单元格。您好,谢谢,我愿意。