You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium执行JS修改navigator.webdriver时报Cannot redefine property错误

错误原因

Chrome 88及更高版本中,navigator.webdriver属性默认被设置为不可重配置(configurable: false),你在页面加载完成后调用Object.defineProperty尝试重写该属性时,就会触发权限类JS错误。

解决方案

按优先级可以选择以下任意一种方案:

方案1:通过Chrome启动参数直接关闭webdriver标记(最稳定)

直接在Chrome启动配置中添加禁用自动化标记的参数,从根源上避免navigator.webdriver被赋值为true,不需要额外执行JS脚本:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 核心参数,禁用自动化受控标记
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 额外辅助防检测参数
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)

# 初始化RemoteDriver时传入配置
self.driver = webdriver.Remote(
    command_executor="http://你的远程Hub地址/wd/hub",
    options=chrome_options
)

方案2:通过CDP命令提前注入重写脚本

如果需要保留JS重写的逻辑,可以调用Chrome DevTools Protocol(CDP)的接口,在页面所有内置脚本执行之前注入重写逻辑,此时navigator.webdriver还未被设置为不可重配置:

# 初始化driver后、访问页面前执行
self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    """
})

# 注入完成后再访问目标页面
self.driver.get("目标页面地址")
注意事项

如果使用的是Selenium Grid远程集群,需要确保集群的Chrome节点没有禁用CDP调用权限,否则execute_cdp_cmd会执行失败。

内容的提问来源于stack exchange,提问作者The Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:45:04