具有动态ID的嵌套表中的按钮

时间:2014-04-01 12:34:11

标签: watir-webdriver

我试图点击表格单元格中的按钮,该表格单元格的动态名称前缀为button_keep

这是firebug为表格单元指出的唯一路径。

#mergePatientsSelectedTable > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1)

我试图使用以下功能到达那里但却找不到按钮。

b.table(:id => "mergePatientsSelectedTable").tbody{2}.tr{1}.td{2}.table{1}.tbody{1}.tr{1}.td{1}.button(:index => 0).button(:name => /button_keep/).click

我曾尝试在单元格上进行闪存并使用IRB,但它继续给我一个无法找到按钮的断言。

任何建议。谢谢

1 个答案:

答案 0 :(得分:0)

您不需要写出整个路径。每个方法/定位器都在所有后代中查找,而不仅仅是直接子项。使用整个路径可以使代码非常脆弱。

那么为什么不只是根据已知属性找到按钮:

b.table(:id => "mergePatientsSelectedTable").button(:name => /button_keep/).click

但是要解释为什么你的解决方案有问题,做tbody{2}实际上会返回第一个tbody元素(而不是第二个)。 {2}是一个被忽略的块。

例如,考虑一下html:

<div>hi</div>
<div>bye</div>

您可以看到使用块时返回第一个div:

b.div{2}.text
#=> "hi"

要获得第二个div,您可以使用索引定位器或获取集合的第二个元素:

b.div(:index => 1).text
#=> "bye"

b.divs[1].text
#=> "bye"

所以如果你真的想要完成整个路径,你可以做到:

b.table(:id => "mergePatientsSelectedTable").tbody(:index => 1).tr.td(:index => 1).table.tbody.tr.td.button(:name => /button_keep/).click

请注意:

  • nth-child是基于1的索引,而Watir使用基于0的索引。
  • 如果您想要第一场比赛,则不需要包含索引 - 假定为:index => 0