使用`Array#[]`与`find(" ...:nth-​​child(n)")`

时间:2016-08-04 03:44:03

标签: ruby capybara

当我想通过索引从同一类型的多个节点中选取某个节点时,有以下几种方法:

some_table_node.find("tr:nth-child(3)").find("td:nth-child(5)")

some_table_node.all("tr")[2].all("td")[4]

哪种方式更好?你能提供你偏好的论据吗?

2 个答案:

答案 0 :(得分:2)

接受的答案实际上并不是很大的区别,因为all可以通过传递其中一个计数选项来等待。两者之间的真正区别在于all(和first)的结果无法自动重新加载。这意味着如果您存储一个元素,然后在页面上替换元素后尝试使用它,您将收到一个过时的节点错误。如果使用find,它将尝试重新查询查找并重新加载匹配的元素。较小的好处是find调用涉及较少的数据传输,因此速度稍快。

另请注意,您的查询并不总是相同。如果你的表中有一个tr,后跟t多个t,那么all查询将返回tbody的第二行,而find将返回tbody的第三行< / p>

<table id="some_table">
  <thead>
   <tr>
     <th>...</th>
   </tr>
  </thead>
  <tbody>
    <tr>...</tr>
    <tr>...</tr>  <= some_table_node.all('tr')[2] will return this
    <tr>...</tr>  <= some_table_node.find('tr:nth-child(3)') will return this
    <tr>...</tr>
  </tbody>
</table>

答案 1 :(得分:1)

find等待,all没有。通常这意味着find不那么脆弱(并且更优秀)。您还应该能够将前者简化为:

some_table_node.find("tr:nth-child(3) td:nth-child(5)")