XPATH 往往会随时间变化,这使得通过 XPATH 查找元素变得无用

XPATHs tend to change with time, making finding elements by XPATH not useful

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

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

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

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

您还没有说明您使用 Selenium 的目的。两个主要用户是 (a) 软件测试(检查您的软件是否正确显示屏幕)和 (b) 从 third-party 个网站抓取数据。两种情况解决问题的策略不同

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

要从 third-party 网站提取数据,请尽可能使用已发布的 API 数据,而不是 screen-scraping - 即使您必须为访问付费,长期 运行 会更便宜。从 HTML 页面上抓取数据效率低下,它会让您完全暴露在未经通知的屏幕外观更改中。

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

更有可能继续工作

但最好的建议是,如果您想编写一个可以灵活更改的应用程序,请完全避免屏幕抓取。