【问题标题】:Table iteration using WATIR使用 WATIR 进行表迭代
【发布时间】:2015-05-24 10:26:43
【问题描述】:

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

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',所以新扩展的表工作正常,所以无论如何我可以在不终止循环的情况下避免这个问题吗?

【问题讨论】:

    标签: ruby watir


    【解决方案1】:

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

    所以你有两个选择:

    1. 再次致电table.rows
    2. 调用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

    正如我所说,没有必要遍历表来单击您的按钮。您可以通过xpathcss 直接联系到它。

    【讨论】:

    • > 是的,我知道。 > 这就是我正在做的,但我觉得每次 table 缩小和扩大然后我必须调用 b.table.rows。
    • 你好,你另外解释的我已经明白了,我知道它被放入数组中,每当页面刷新时它都不会改变,但你在最后一行解释的是我不清楚,“正如我所说,没有必要迭代......”你是说我们可以使用 xpath 指出一个特定的行吗?
    • @RAJ,我不知道如何使用 xpath 到达表格中的特定单元格,但它应该是可能的。您也可以通过nameidtextclass 或其他属性访问您的按钮,避免处理表格单元格。
    • 嗨,谢谢,我会的。
    猜你喜欢
    • 2022-11-11
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2014-09-25
    • 2020-08-08
    相关资源
    最近更新 更多