Chrome 130+环境下Selenium 3执行JavaScript报错的解决求助
问题:Selenium 3.6(Node.js)结合Chrome 130+执行JS代码失效的解决办法
项目仍在使用Selenium 3.6(Node.js),因应用特性需要执行JavaScript代码,该操作在Chrome 130版本前可正常运行,但升级至Chrome 130+后失效,不过在Firefox中仍能正常工作。已知最新版Selenium 4可解决此问题,但目前无法切换至Selenium 4。曾排查是否与JsonWireProtocol的变更有关,但未找到相关答案,求解决办法。
相关代码片段
let element = this.driver.wait(until.elementLocated(By.css(selector)), waitTimeout); await this.driver.wait(until.elementIsVisible(element), waitTimeout); await this.driver.wait(until.elementIsEnabled(element), waitTimeout); await this.driver.executeScript('arguments[0].scrollIntoView(true);', element);
执行错误信息
JavascriptError: javascript error: Cannot read properties of undefined (reading 'scrollIntoView') (Session info: chrome=131.0.6778.86) (Driver info: chromedriver=131.0.6778.85 (3d81e41b6f3ac8bcae63b32e8145c9eb0cd60a2d-refs/branch-heads/6778@{#2285}),platform=Windows NT 10.0.19045 x86_64)
解决办法
Chrome 130+对JsonWireProtocol的元素序列化逻辑做了变更,Selenium 3.6的旧版本无法正确处理新协议返回的元素对象,导致executeScript时arguments[0]为undefined。以下是几种可行的解决方式:
方案1:在JS代码内直接定位元素
跳过Selenium传递元素对象的步骤,把选择器传入JS代码,在浏览器端直接定位元素并执行操作:
await this.driver.executeScript(`document.querySelector('${selector}').scrollIntoView(true);`);
注意:如果选择器包含引号等特殊字符,需要提前转义,避免JS语法错误。
方案2:降级Chrome版本到129及以下
如果暂时无法修改代码,可以将Chrome浏览器和对应版本的chromedriver降级到129版本,恢复原有兼容性。
方案3:临时修改Selenium 3的内部逻辑
部分开发者针对该问题提供了临时兼容补丁,可修改selenium-webdriver包的内部代码,适配Chrome 130+的元素处理逻辑:
- 找到项目依赖中
selenium-webdriver/lib/webdriver.js文件 - 修改元素序列化相关逻辑,确保传递给
executeScript的元素能被Chrome正确识别
这种方式需要维护自定义补丁,后续升级依赖时容易失效,仅作为应急方案。
内容的提问来源于stack exchange,提问作者G. Kolev
相关产品推荐
相关产品推荐

