如何正确移除 Selenium 中的 window.navigator.webdriver
使用 Google 的Chrome Devtools-Protocol(Chrome开发工具协议)
简称CPD
。
我们打开 CPD 的官方文档,可以看到如下的命令:
在每个 Frame 刚刚打开,还没有运行 Frame 的脚本前,运行给定的脚本。
通过这个命令,我们可以给定一段 JavaScript 代码,让 Chrome 刚刚打开每一个页面,还没有运行网站自带的 JavaScript 代码时,就先执行我们给定的这段代码。
那么如何在 Selenium 中调用 CDP 的命令呢?实际上非常简单,我们使用driver.execute_cdp_cmd
。根据 Selenium 的官方文档,传入需要调用的 CDP 命令和参数即可:
于是我们可以写出如下代码:
from selenium.webdriver import Chrome
driver = Chrome('./chromedriver')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('http://exercise.kingname.info')
运行效果如下图所示:
完美隐藏window.navigator.webdriver
。并且,关键语句:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
只需要执行一次,之后只要你不关闭这个driver
开启的窗口,无论你打开多少个网址,他都会自动提前在网站自带的所有 js 之前执行这个语句,隐藏window.navigator.webdriver
。
如果有人运行上面的代码,出现如下报错:
那么请升级你的 ChromeDriver。老版本的 Chrome + ChromeDriver 只能用以前的方法,不能用今天的方法。新版本的 Chrome + ChromeDriver 可以使用今天的方法,但不能用老方法。