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
相关产品推荐
相关产品推荐

