xpath - 网页抓取选择器

标签 xpath css-selectors

你从什么层次开始你的选择器?
似乎有从目标元素的容器开始的约定,但为什么不从目标元素本身开始,特别是在 id 或以通配符加唯一标识符开头的情况下?
递归下降似乎是每个人最好的 friend 。

最佳答案

XPaths 和 Css-Selector 非常通用,可以用许多不同的方式描述同一个元素——即一个元素有无数个可能的定位器来描述它。目标是获得满足开发人员需求的东西,其中可能包括可读性、独特性和/或适应性。

考虑以下 html 示例:

<div id='mainContainer'>
  <span>some span</span>
</div>

如果我试图为 <span> 制作定位器元素,我不会选择//span ,因为这可能会产生太多的结果。相反,您可以从具有 id 的父级开始,然后继续跨度://*[@id='mainContainer']/span ,或者://span[parent::*[@id='mainContainer']] .哪个 XPath 更好?无论您个人认为哪个更具可读性。我同意你的观点,第一个例子似乎更常见,尽管我自己更倾向于后者。

有时,以某种方式制作定位器的目的是具有适应性。例如,我很少写这样的定位器://*[@class='fooBar'] .原因是因为在现代 Web 开发中,类频繁地来来去去,并且该元素的类很可能会在最轻微的微风中改变。相反,你可以写 //*[contains(@class,'fooBar')] .现在,当开发人员进入并添加一个纯样式类时,您不必返回并更新所有 selenium 测试。这也是我经常使用通配符的原因。如果开发人员进入并更新 divspan ,我的测试仍然有效。

正如@Gilles Quenot 评论的那样,假设 id 是唯一的并不总是安全的。许多网站是由某人的失业叔叔编写的,他在 86 年上过 html 类(class)。他们很糟糕,根本不关心标准或审计。这是您需要在定位器中包含足够信息以指定您正在谈论的确切元素/元素的另一个原因,但不需要太多信息来描述太多元素。

另一个评论是 XPaths 是双向的,而 Css-Selectors 不是。这意味着 XPath 可以从子到父,从父到子,而 Css-Selectors 只能从父到子。这会影响您从哪个节点开始,并且可能是您看到更多 Css-Selector 从父/祖先节点开始的原因。

TL;DR 没有惯例,只是个人喜好。做满足您需求的事情。

关于xpath - 网页抓取选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316261/

相关文章:

javascript - 使用xpath提取结构化数据的策略

java - 如何在Saxon xquery中查询一个查询结果

reactjs - 在 React.js 上测试自动化

xpath - xpath:有没有办法在xpath中获取所有 child 的文本

javascript - 使用带有 JavaScript 的 Selenium WebDriver 从 XPath 定位元素获取文本

css - 如何将鼠标悬停在元素上并更改远祖先的样式?

html - 更具体的 CSS 规则不起作用

JQuery:如何在 $(this) 中找到名为 "apples"的输入?

css - 如何缩写表格元素的长 Selenium CSS 代码?

python - 相同的 xpath 在 Centos、Ubuntu 上返回不同的值