无法定位驱动程序错误
解决驱动程序可执行文件的路径缺失问题。
CSS 和 XPath 选择器有时很难正确获取。
您尝试使用的 CSS 或 XPath 选择器包含无效字符或无效查询。
通过验证器服务运行您的选择器
或者使用浏览器扩展来获取已知的好值
无法在您尝试定位元素的准确时刻找到该元素。
当元素先前被定位但当前无法访问时,元素会过时。元素不会自动重新定位;驱动程序为元素创建引用 ID,并在 DOM 中期望找到它的特定位置。如果它在当前 DOM 中找不到该元素,则使用该元素的任何操作都会导致此异常。
当以下情况发生时,可能会出现这种情况
DOM 已更改
当页面刷新或页面上的项目移动时,页面上仍然存在具有所需定位器的元素,只是不再能通过正在使用的元素对象访问,并且必须重新定位元素才能再次使用。这通常通过以下两种方式之一完成
每次使用元素时,始终重新定位该元素。在定位和使用元素之间的微秒内,元素过期的可能性很小,尽管可能。缺点是这不是最有效的方法,尤其是在远程网格上运行时。
使用存储定位器并缓存已定位的 Selenium 元素的另一个对象包装 Web 元素。当使用此包装对象执行操作时,您可以尝试使用先前定位的缓存对象,如果它已过期,则可以捕获异常,使用存储的定位器重新定位元素并重新尝试该方法。这更有效,但如果您的定位器在页面更改后引用了不同的元素(而不是您想要的元素),则可能会导致问题。
上下文已更改
元素对象存储用于给定上下文,因此如果您移动到不同的上下文(例如,不同的窗口或不同的框架或 iframe),元素引用仍然有效,但将暂时无法访问。在这种情况下,重新定位元素没有帮助,因为它不存在于当前上下文中。要解决此问题,您需要确保在使用该元素之前切换回正确的上下文。
页面已更改
这种情况是指您不仅仅是更改了上下文,而是导航到了另一个页面,并销毁了定位元素的上下文。您不能仅从当前上下文重新定位它,也不能切换回它有效的活动上下文。如果这是导致错误的原因,您必须导航回正确的位置并重新定位它。
当 Selenium 尝试单击一个元素,但单击将改为由另一个元素接收时,会发生此异常。在 Selenium 单击元素之前,它会检查该元素是否可见、未被任何其他元素遮挡并且已启用 - 如果该元素被遮挡,它将引发此异常。
UI 元素重叠
UI 上的元素通常彼此相邻放置,但偶尔元素可能会重叠。例如,导航栏始终在您滚动页面时保持在窗口的顶部。如果该导航栏恰好覆盖了我们要单击的元素,Selenium 可能会认为它是可见且已启用的,但当您尝试单击它时,它会抛出此异常。弹出窗口和模态框也是常见的罪魁祸首。
动画
带有动画的元素也有可能导致此异常 - 建议等待动画停止后再尝试单击元素。
使用显式等待
显式等待很可能是您在这些情况下的最佳选择。一个好方法是将 ExpectedCondition.ToBeClickable()
与 WebDriverWait
结合使用,以等待正确的时机。
将元素滚动到视图中
在元素超出视图,但 Selenium 仍然将该元素注册为可见(例如,导航栏重叠屏幕顶部的部分)的情况下,您可以使用 WebDriver.executeScript()
方法执行 javascript 函数来滚动(例如,WebDriver.executeScript('window.scrollBy(0,-250)')
),或者您可以使用带有 Actions.moveToElement(element)
的 Actions 类。
有时,您尝试访问的会话与当前可用的会话不同
这通常发生在会话已被删除(例如 driver.quit()
)或会话已更改时,例如当最后一个选项卡/浏览器已关闭时(例如 driver.close()
)
检查您的脚本中是否有 driver.close()
和 driver.quit()
的实例,以及其他可能的选项卡/浏览器关闭原因。可能是您在应该/可以之前正在定位元素。
解决驱动程序可执行文件的路径缺失问题。
了解更多信息或查看赞助商的完整列表。