html - 如何使用 Capybara 找到紧跟在另一个元素之后的特定元素?

标签 html css xpath css-selectors capybara

我正在尝试使用 learn Capybara 来完成我的抓取任务。到目前为止,我只将它用于测试。我想学习一百万件事,但在最基本的部分,我想知道如何找到某个元素,该元素是兄弟元素,并且我能够找到的另一个元素之后?

拿一个这样的页面:

<body>
  <h3>Name1</h3>
  <table>
    ...
  </table>
  <h3>Name2</h3>
  <table>
    ...
  </table>
  <h3>Name3</h3>
  <table>
    ...
  </table>
</body>

我想退回 <table> <h3> 之后的元素具有文本 Name2 的元素。

我知道如何使用 all 遍历元素,而且我知道如何使用 first而不是 find ,但我不知道如何“找到特定元素 Y 之后的第一个元素 X”。

最佳答案

CSS

在 CSS 中,您可以使用兄弟选择器。这些允许您选择兄弟元素;或那些处于相同嵌套级别且具有相同父元素的。兄弟选择器有两种类型:

  • '+' 相邻兄弟选择器
  • '~' 一般兄弟选择器(相邻或不相邻的兄弟)

通常最好尽可能避免按文本进行匹配。 (这使您的规范更容易编写,也意味着文本更改不太可能破坏您的规范。)在理想的世界中,您的“h3”元素可能具有 ID,我们可以:

find('h3#name2+table')

但是,在您的示例中,它们没有 ID,因此让我们将几个查询连接到我们想要的范围。

find('h3', text: 'Name2').find('+table')

首先,我们找到了正确的“h3”元素(使用文本匹配),然后以该查询为基础,我们请求同级“table”元素。

您可能还注意到,如果您使用通用兄弟选择器“~”,您会得到一个不明确的元素错误; capybara 找到了所有“表格”元素,而不仅仅是相邻的元素。

XPath

如果您真的被迫选择文本元素,有时 XPath 实际上更容易使用。所以你可以改为:

find(:xpath, "//h3[contains(text(),'Name2')]/following-sibling::table")

更难阅读,但做同样的事情。首先找到带有文本“Name2”的“h3”,然后选择它的兄弟“table”元素。

关于html - 如何使用 Capybara 找到紧跟在另一个元素之后的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30206154/

相关文章:

c++ - 在 Pugixml 中获取 XPath 查询的行/列

javascript - 将 div 与第一个垂直居中的 div 对齐

html - 浏览器中缺少滚动条

javascript - Html 地理定位在我的移动网络应用程序上不起作用 | Spring MVC

python - xpath 不包含 A 和 B

sql-server - Xpath 为有效的 Xpath 表达式返回 NULL

html - flexbox 在 firefox 和 chrome 中的行为不一致?

javascript - 本地数据库 API - 已弃用 有什么替代方案?

html - C++ 更改输出文件名(如果存在)

html - 了解 Perl 中的 JSON-RPC