理解常见错误

如何解决 Selenium 代码中的各种问题。

InvalidSelectorException

CSS 和 XPath 选择器有时很难正确获取。

可能原因

您尝试使用的 CSS 或 XPath 选择器包含无效字符或无效查询。

可能的解决方案

通过验证器服务运行您的选择器

或者使用浏览器扩展来获取已知的好值

NoSuchElementException

无法在您尝试定位元素的准确时刻找到该元素。

可能原因

  • 您在错误的位置查找元素(可能是之前的操作未成功)。
  • 您在错误的时间查找元素(该元素尚未出现在 DOM 中)。
  • 自您编写代码以来,定位器已更改

可能的解决方案

  • 确保您在您期望的页面上,并且代码中之前的操作已正确完成
  • 确保您正在使用适当的等待策略
  • 使用浏览器的开发者工具控制台更新定位器或使用浏览器扩展,例如

StaleElementReferenceException

当元素先前被定位但当前无法访问时,元素会过时。元素不会自动重新定位;驱动程序为元素创建引用 ID,并在 DOM 中期望找到它的特定位置。如果它在当前 DOM 中找不到该元素,则使用该元素的任何操作都会导致此异常。

可能原因

当以下情况发生时,可能会出现这种情况

  • 您已刷新页面,或者页面的 DOM 已动态更改。
  • 您已导航到不同的页面。
  • 您已切换到另一个窗口或进入或退出框架或 iframe。

可能的解决方案

DOM 已更改

当页面刷新或页面上的项目移动时,页面上仍然存在具有所需定位器的元素,只是不再能通过正在使用的元素对象访问,并且必须重新定位元素才能再次使用。这通常通过以下两种方式之一完成

  • 每次使用元素时,始终重新定位该元素。在定位和使用元素之间的微秒内,元素过期的可能性很小,尽管可能。缺点是这不是最有效的方法,尤其是在远程网格上运行时。

  • 使用存储定位器并缓存已定位的 Selenium 元素的另一个对象包装 Web 元素。当使用此包装对象执行操作时,您可以尝试使用先前定位的缓存对象,如果它已过期,则可以捕获异常,使用存储的定位器重新定位元素并重新尝试该方法。这更有效,但如果您的定位器在页面更改后引用了不同的元素(而不是您想要的元素),则可能会导致问题。

上下文已更改

元素对象存储用于给定上下文,因此如果您移动到不同的上下文(例如,不同的窗口或不同的框架或 iframe),元素引用仍然有效,但将暂时无法访问。在这种情况下,重新定位元素没有帮助,因为它不存在于当前上下文中。要解决此问题,您需要确保在使用该元素之前切换回正确的上下文。

页面已更改

这种情况是指您不仅仅是更改了上下文,而是导航到了另一个页面,并销毁了定位元素的上下文。您不能仅从当前上下文重新定位它,也不能切换回它有效的活动上下文。如果这是导致错误的原因,您必须导航回正确的位置并重新定位它。

ElementClickInterceptedException

当 Selenium 尝试单击一个元素,但单击将改为由另一个元素接收时,会发生此异常。在 Selenium 单击元素之前,它会检查该元素是否可见、未被任何其他元素遮挡并且已启用 - 如果该元素被遮挡,它将引发此异常。

可能原因

UI 元素重叠

UI 上的元素通常彼此相邻放置,但偶尔元素可能会重叠。例如,导航栏始终在您滚动页面时保持在窗口的顶部。如果该导航栏恰好覆盖了我们要单击的元素,Selenium 可能会认为它是可见且已启用的,但当您尝试单击它时,它会抛出此异常。弹出窗口和模态框也是常见的罪魁祸首。

动画

带有动画的元素也有可能导致此异常 - 建议等待动画停止后再尝试单击元素。

可能的解决方案

使用显式等待

显式等待很可能是您在这些情况下的最佳选择。一个好方法是将 ExpectedCondition.ToBeClickable()WebDriverWait 结合使用,以等待正确的时机。

将元素滚动到视图中

在元素超出视图,但 Selenium 仍然将该元素注册为可见(例如,导航栏重叠屏幕顶部的部分)的情况下,您可以使用 WebDriver.executeScript() 方法执行 javascript 函数来滚动(例如,WebDriver.executeScript('window.scrollBy(0,-250)')),或者您可以使用带有 Actions.moveToElement(element) 的 Actions 类。

InvalidSessionIdException

有时,您尝试访问的会话与当前可用的会话不同

可能原因

这通常发生在会话已被删除(例如 driver.quit())或会话已更改时,例如当最后一个选项卡/浏览器已关闭时(例如 driver.close()

可能的解决方案

检查您的脚本中是否有 driver.close()driver.quit() 的实例,以及其他可能的选项卡/浏览器关闭原因。可能是您在应该/可以之前正在定位元素。


无法定位驱动程序错误

解决驱动程序可执行文件的路径缺失问题。

上次修改时间:2024 年 11 月 7 日:修改/重新格式化了一些句子 (#1981) (77ae509e3ca)