gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:42:39 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com