【问题标题】:XPATHs tend to change with time, making finding elements by XPATH not useful [duplicate]XPATH 往往会随着时间而变化,使得通过 XPATH 查找元素没有用 [重复]
【发布时间】:2022-02-02 02:00:33
【问题描述】:

在使用Selenium 时,我经常使用driver.find_element(By.XPATH, ) 而不是driver.find_element(By.CSS_SELECTOR, )。我发现复制XPATH 比理解网站的HTML 结构更容易。

但是我遇到了一个小问题。最近我注意到我使用XPATH 的大部分脚本都不起作用,因为XPATH 会发生变化。他们是解决这个问题的方法吗? xpathfull xpath 之间有区别吗?

【问题讨论】:

  • 如果我错了,请纠正我,但我猜CSS_SELECTOR 也可能会改变,这取决于网站所有者,但可能比XPATH 更小
  • @jaSON 它确实回答了问题的第二部分,谢谢!

标签: python selenium xpath css-selectors


【解决方案1】:

您必须学习如何创建正确定位器。
自动生成的 XPath 或 CSS 选择器定位器非常脆弱。这使它们几乎毫无用处。
同样,两者都自动创建了 XPath 和 CSS 选择器定位器。
创建好的定位器将使您的代码更加稳定,但是,任何基于 Selenium 的代码在前端开发人员参与更改后都需要维护,因为他们正在更改页面上的页面结构和元素。
关于 XPath,一般有 relativeabsolute XPath。
Absolute XPath 定义了从页面顶部到特定元素节点。
relative XPath 为某些元素节点定义了一些简短的唯一定位器。

【讨论】:

  • 那么什么是好的定位器?有通用的好定位器吗?还是更多地基于案例?
  • 没有通用的好定位器。在最简单的情况下,您必须查看元素属性并找到一些具有唯一值的属性。像唯一的类名或使该元素唯一的类名组合等。通常它会是一些更复杂的组合,例如具有特定标签名称的父元素和类名的组合或srctest-id或任何其他子元素的属性和一些标记名称和属性值,使此依赖关系唯一。
  • 但这仍然是两个元素之间的依赖关系,而不是由 15 个元素定义的明确路径,因此任何更改都会破坏您的定位器
  • 只要谷歌how to create good xpath locators它会给你几个教程
【解决方案2】:

这是屏幕抓取的一个基本问题。 HTML 页面上的信息是为人类用户设计的,而不是为软件访问而设计的,它会根据人类用户的感知需求随时间而变化,而忽略屏幕抓取工具的需求。

你还没有说你用 Selenium 做什么。两个主要用户是 (a) 软件测试(检查您的软件是否正确显示屏幕)和 (b) 从第三方网站抓取数据。两种情况解决问题的策略不同。

对于测试,尽量使用不依赖于查看 HTML 的单元测试来测试您的应用程序的功能;仅查看您实际需要测试用户界面的 HTML。对于这些测试,您将不得不面对这样一个事实,即当 HTML 更改时,测试也必须更改。

对于从第三方网站提取数据,如果可能,请使用已发布的数据 API,而不是屏幕抓取 - 即使您必须为访问付费,从长远来看它也会更便宜。从 HTML 页面中抓取数据效率低下,而且会让您完全暴露在未通知的屏幕外观更改中。

话虽如此,还是有一些编写 XPath 的方法可以使其对此类更改更具弹性。但前提是您正确猜测页面的哪些方面可能会发生变化,以及哪些方面可能会保持稳定。正如您所建议的那样,“xpath”和“full xpath”之间没有区别,而是有不同的方式来编写 XPath 表达式以使它们能够适应 HTML 中的变化。显然,例如 //tr[td[1]='London']/td[2]//div[3]/div[1]/table[9]/tbody/tr[43]/td[2] 更有可能继续工作。

但最好的建议是,如果您想编写一个适应变化的应用程序,请完全避免屏幕抓取。

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2020-05-03
    • 2020-07-20
    • 2016-03-12
    • 2017-09-14
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多