使用WATIR的表迭代

时间:2015-05-24 10:26:43

标签: 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

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

1 个答案:

答案 0 :(得分:0)

调用b.table(:id,'something').rows后,行已经是固定的ruby数组。 下面没有任何东西可以改变那个数组,如果你试图在循环中改变那个数组,ruby很可能会抱怨。

所以你有两个选择:

  1. 再次致电table.rows
  2. 致电b.button(...).click,然后只拨打table.rows
  3. 希望这有帮助。

    进一步澄清:不,不可能执行您想要的任何操作。 #rows实际上会返回Watir::ElementCollection#each_with_index来电#each,如果您查看#each来源,您会看到:

    def each(&blk)
      to_a.each(&blk)
    end
    

    #to_a生成一个包含元素的新数组对象。基本上你得到一个行数组并迭代它们。 Watir 幸运的是并不会尝试变聪明,并且在页面更改时更改您所请求的阵列。在迭代它时更改数组实际上是一个非常糟糕的主意。结果将是不可预测的。这就是为什么每次想要查看当前页面状态时都需要调用table(...).rows

    正如我所说,没有必要迭代表格来点击你的按钮。您可以通过xpathcss直接与其联系。