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