获取兄弟节点而不依赖父索引?

时间:2012-07-20 20:31:18

标签: dom watir-webdriver

我发现在行具有可靠属性的单元格中获取文本值很容易,例如。 $browser.tr(:class, "datarow2_sm")

但是,我还需要从表格中的下一个<tr>获取数据,仅定义为<tr class="">。 它的HTML内容也没有任何非常独特的东西,说话。

捕获该行的一种不情愿的方法是:

 cell1value = $browser.tr(:class, "datarow2_sm").parent[3][1].text
 cell2value = $browser.tr(:class, "datarow2_sm").parent[3][2].text.to_f  # etc.

但是我不想依赖固定索引 [3] ,因为更宽的表中的这些东西可能会发生变化。除了 .parent 之外,还有像 .sibling .next / * .previous *之类的东西,比如在Mechanize中)?也许更喜欢相同类型的节点(tr到另一个tr不是td或DOM中的某些非行节点)?

2 个答案:

答案 0 :(得分:3)

您可以使用css邻近兄弟选择器。请注意,Watir-Webdriver目前仅支持元素节点的css选择器。

您将执行以下操作(注意to_subtype是将其转换回TableRow而不是Element):

puts b.element(:css, "tr.datarow2_sm + tr").to_subtype.text 

<强>更新

如果要获取下一行中的第二个单元格,可以执行以下操作之一:

puts b.element(:css, "tr.datarow2_sm + tr").to_subtype[1].text  
puts b.element(:css, "tr.datarow2_sm + tr").td(:index, 1).text

答案 1 :(得分:2)

CSS有一个名为adjacent sibling selector的特殊选择器:

  

相邻的兄弟选择器具有以下语法:E1 + E2,其中   E2是选择器的主题。选择器匹配E1和E2   在文档树中共享同一个父级,E1紧接在之前   E2,忽略非元素节点(如文本节点和注释)。