我的页面中有一个表需要处理,我正在使用以下代码
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',这样新扩展的表工作正常,所以无论如何我可以在不终止循环的情况下避免这个问题吗?
答案 0 :(得分:0)
调用b.table(:id,'something').rows
后,行已经是固定的ruby数组。 下面没有任何东西可以改变那个数组,如果你试图在循环中改变那个数组,ruby很可能会抱怨。
所以你有两个选择:
table.rows
b.button(...).click
,然后只拨打table.rows
希望这有帮助。
进一步澄清:不,不可能执行您想要的任何操作。 #rows
实际上会返回Watir::ElementCollection
,#each_with_index
来电#each
,如果您查看#each
来源,您会看到:
def each(&blk)
to_a.each(&blk)
end
#to_a
生成一个包含元素的新数组对象。基本上你得到一个行数组并迭代它们。 Watir 幸运的是并不会尝试变聪明,并且在页面更改时更改您所请求的阵列。在迭代它时更改数组实际上是一个非常糟糕的主意。结果将是不可预测的。这就是为什么每次想要查看当前页面状态时都需要调用table(...).rows
。
正如我所说,没有必要迭代表格来点击你的按钮。您可以通过xpath
或css
直接与其联系。