selenium - Selenium 的 cssSelector 与 XPath

标签 selenium selenium-webdriver xpath css-selectors webdriver

根据我的理解,CSS 选择器遍历 DOM。因为 CSS 文件不会有任何关于元素位置的信息,所以为什么 cssSelectorXPath 更快(理论上)。

理论上,cssSelectorXPath 花费更少的时间,因为 XPath 需要遍历 HTML DOM。 XPath 我们可以在 DOM 层次结构中向后或向前搜索元素,而 CSS 只能向前搜索。

但是,如果cssSelector也遍历HTML DOM,那么它如何使cssSelector更快。

换句话说,cssSelector在内部是如何实际工作的,以及为什么它总是比xpath更适合/推荐每个人使用的原因

此外,请分享使用 cssSelector 相对于 XPath 的其他好处。

反之亦然,在哪些方面XPathcssSelector更好

最佳答案

我读过很多文章,我见过一些像this这样的文章和 this有数据表明 CSS 选择器更快,我做了一些测试并得出了相同的结论。 2016 年 12 月,我与 elementalselenium.com 的作者 Dave Haeffner 进行了交谈,并向他询问了他网站上的性能数据(在我上面链接的帖子中),因为这些数据已经很旧了。他linked me a presentation (参见第 18-23 页)他更新了测试,CSS 选择器仍然更快,但 XPath 在一些配置中正在迎头 catch 。

所以我们可以看到证据证明这是真的,但我从未见过有人谈论原因的技术细节。如果我猜的话,那是因为不同的浏览器已经做了很多工作来优化页面渲染的速度。让 CSS 选择器快速工作可以使页面渲染速度更快,并且由于浏览器驱动程序利用浏览器定位元素的能力,这意味着 CSS 选择器通常会获胜。我读到一些浏览器已经提高了它们的 XPath 定位器速度,但我认为它可能总是落后于 CSS 选择器,因为它比 CSS 选择器要少得多。

CSS 选择器和 XPath 都必须遍历 DOM,因此除了遍历引擎的速度之外,没有真正的区别。由于 CSS 选择器的广泛使用,CSS 选择器引擎在这一点上与 XPath 引擎相比可能是一台经过微调的机器。

我的一般定位器策略是 ID 优先,CSS 选择器用于其他所有内容。当其他方法都不起作用时,我使用 XPath。各个站点的情况会有所不同,但根据我的经验,ID 可能占我定位器的 10% 左右。 CSS 选择器大约占 80%,最后 10% 是 XPath。当我需要通过包含的文本来定位元素并且很少使用 DOM 遍历时,我通常使用 XPath。我的 XPath 使用示例可能是我需要在 TABLE 中查找相对于行标签的元素,例如表行中奶酪的价格,其中第一个单元格包含“奶酪”,第三个单元格包含价格。

我认为 XPath 在诸如 SO 之类的网站和许多博客上经常出现,因为它易于访问。我所要做的就是右键单击开发工具中的一个元素并复制 XPath。很多时候这个问题会生成一个糟糕的、脆弱的 XPath。手工制作的 XPath 更好,但手工制作好的 XPath 或 CSS 选择器需要时间和经验。许多人不愿意投入时间。精心设计的 CSS 选择器或 XPath 也会让事情变得更慢。很多时候,定位元素的方式有很多种,其中一些比其他更有效……这取决于定位器的效率以及如何使用它。格式错误的 CSS 选择器不会自动比格式正确的 XPath 更快。

关于selenium - Selenium 的 cssSelector 与 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267591/

相关文章:

c# - XPath 在 C# 中无法正常工作

python - 如何在Python中使用selenium打印工具提示消息

java - 关于 Selenium 的新手问题

java - 如何使用 Java 在 selenium webdriver 中绕过或处理 Windows 身份验证

xpath - Selenium Webdriver - XPath : How to use 'and' 'Or' in xpath

python - 有人知道如何使用 selenium webdriver 识别 shadow dom web 元素吗?

python - 在 scrapy 中,我试图检索链接列表,然后在单个 scrapy 文件中从这些链接中抓取数据。我的 csv 文件返回 xpath 列表。

.net - 使用 XmlDocuments、XSLT 或 Linq 解析 Xml、XPath 哪个更有效?

ruby-on-rails - 有多少人将 Rspec 用于 Controller 和 View ?

Python Selenium 无法在网站中找到 ID