ChromeDriver在Chrome v126无法定位元素,v125正常求解决方案
问题场景
我碰到一个奇怪的问题:用C#写的Selenium测试在Chrome v125上运行完全正常,但升级到Chrome v126后,通过By.ClassName定位元素时会抛出NoSuchElementException。但Chrome v126的控制台用相同的选择器能正常找到元素,用JavascriptExecutor执行点击操作也能成功——这说明元素明明存在于DOM中,但Selenium就是定位不到。
测试代码示例:
// 初始化Driver var chromeOptions = new ChromeOptions(); chromeOptions.BrowserVersion = BrowserVersion; webDriver = new RemoteWebDriver(new Uri($"http://{GridMachine}:4444/wd/hub"), chromeOptions); // 无法运行,会抛出NoSuchElementException webDriver.FindElement(By.ClassName("saveTransaction")).Click(); var x = webDriver.FindElement(By.ClassName("saveTransaction")).Displayed; // 可以正常运行 var js = webDriver as IJavaScriptExecutor; js.ExecuteScript("window.document.getElementsByClassName(\"saveTransaction\")[0].click()");
可能的解决方案
匹配ChromeDriver与Chrome版本
Chrome v126必须搭配对应版本的ChromeDriver(v126.x)使用。如果你的Selenium Grid节点上的ChromeDriver还是v125版本,就会出现定位异常。检查Grid节点上的ChromeDriver版本,确保和Chrome浏览器版本完全一致。添加显式等待策略
Chrome v126的页面渲染速度可能有变化,导致Selenium在元素还未完全加载完成时就尝试定位。用显式等待替代直接调用FindElement,等待元素可交互:var wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(10)); var saveButton = wait.Until(driver => driver.FindElement(By.ClassName("saveTransaction"))); saveButton.Click();或者更精准地等待元素可点击:
var saveButton = wait.Until(ExpectedConditions.ElementToBeClickable(By.ClassName("saveTransaction")));检查元素是否在iframe内
有时候控制台能找到元素,但Selenium当前的上下文不在元素所在的iframe中。先切换到对应iframe再定位元素:// 定位并切换到目标iframe var targetIframe = webDriver.FindElement(By.Id("your-iframe-id")); webDriver.SwitchTo().Frame(targetIframe); // 操作元素 webDriver.FindElement(By.ClassName("saveTransaction")).Click(); // 操作完成后切回主文档 webDriver.SwitchTo().DefaultContent();更换元素定位方式
Selenium的By.ClassName对类名的处理逻辑可能和浏览器控制台略有差异,比如类名包含特殊字符时。尝试用CSS选择器替代:webDriver.FindElement(By.CssSelector(".saveTransaction")).Click();禁用Chrome新特性
Chrome v126引入的部分新特性可能影响Selenium的元素定位。可以在ChromeOptions中添加参数禁用相关特性:chromeOptions.AddArgument("--disable-features=BlockThirdPartyCookies,ImprovedCookieControls"); // 测试环境下可尝试禁用沙箱 chromeOptions.AddArgument("--no-sandbox");
内容的提问来源于stack exchange,提问作者MarkyMark

