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
、文本
、类
或其他属性来访问按钮,避免处理表格单元格。您好,谢谢,我愿意。