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

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').rows之后,行已经是一个固定的ruby数组下面的任何东西都不能改变这个数组,如果你试图在循环中改变这个数组,ruby很可能会抱怨。
所以你有两个选择:
再次呼叫table.rows
呼叫b.button(...).click然后只呼叫一次
希望这有帮助。
附加说明:不,不可能实现你想要的table.rows实际上返回#rowsWatir::ElementCollection调用#each_with_index,如果查看#each源,您将看到:

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

#each生成包含元素的新数组对象基本上你得到了一个行数组,并对它们进行迭代。幸运的是,Watir并没有试图聪明地在页面更改时从脚下更改您请求的数组实际上,在遍历数组时更改数组是一个非常糟糕的主意结果将是不可预测的这就是为什么每次想查看当前页面状态时都需要调用#to_a
不过,正如我所说,不必遍历表来单击按钮。您可以通过table(...).rowsxpath直接访问它。

关于ruby - 使用WATIR进行表迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30422459/

10-13 06:40