我最近将 Chrome 及其 web 驱动程序从版本 103 更新到版本 106。所附图像中包含的之前可以正常工作的代码现在出现异常,并显示以下错误消息:
“OpenQA.Selenium.WebDriverException:参数无效:找不到 uniqueContextId(会话信息:chrome=106.0.5249.62)”
我发现抛出Exception的点如下 ExpectedConditions.ElementExists(loadingLocator)
有人有建议或已经遇到所描述的问题吗?
谢谢
如果您在框架或窗口之间切换并在立即搜索元素后,这可能会导致问题。如果框架已关闭,即使您切换到默认上下文,元素搜索仍然可能会转到不再存在的旧上下文,这并非完全不可能。
我会尝试让它慢一些。在切换到该帧之前检查该帧是否存在。切换回来并检查您是否确实切换到了默认上下文。检查是否没有其他框架。避免检查该框架中可能存在的元素。
在 github 上快速搜索 chrome 相关项目可以得到以下结果:
https://github.com/v8/v8/blob/9c012f1143703d0353e7a8092d1723aef870cfc3/src/inspector/v8-runtime-agent-impl.cc#L212这可能表明(考虑到存储库性质)您的网站包含一些棘手的 javascript(例如,用于打开框架)和 chrome/chromedriver/selenium 在执行时都会感到惊讶。
UPD
似乎在 Chrome/chromedriver 104(或 105)之前,允许检查默认上下文的元素而不切换到它,而当前框架不再存在(从 DOM 中删除)。这不是正确的行为,但在某个时候是允许的,异常在内部被抑制。
当您进行令人震惊的升级时,例如在版本 109 中,如果启用了实验选项,则可以可靠地重现此异常。
uniqueContextId
似乎是负责验证 am I in the right place to do this action
的机制的一部分,在本例中为框架(上下文)。不幸的是,chrome 命令行似乎没有选项来切换此行为,并且 uniqueContextId
与 contextId
互斥,根据 selenium 源(链接可能不再存在,只需插入活动版本而不是 v110)
在检查框架之前,您应该始终切换回框架,即使它是默认内容。没有继承权。
当涉及到建议(不是 100% 确定的答案)时,我会检查定位器是否始终是唯一的。错误消息指出“uniqueContextId not found”,因此定位器匹配的唯一性可能很重要。
你可以尝试这样的事情:
IList<IWebElement> elements = driver.FindElements(loadingLocator);
并调查元素的数量。不过,这只是猜测。
此外,我会仔细检查 ChromeDriver 的版本,但我假设您在发布问题之前已经这样做了。
就我而言,将网络驱动程序管理器更改为版本 5.1.0 有帮助。 Chrome 浏览器版本 118.0.5993.88.