摄影:产品经理产品经理的三文鱼炒饭

在《一日一技:如何正确移除Selenium中window.navigator.webdriver的值》一文中,我们介绍了在当时能够正确从Selenium启动的Chrome浏览器中移除window.navigator.webdriver的方法。

后来时过境迁,Chrome升级了版本,导致当时的方法已经失效。如下图所示:


针对最新版本的Chrome,我们应该如何正确隐藏这个参数呢?

在那篇文章里面,我骂了一种掩耳盗铃的方式:

打开网页,然后通过执行如下 JavaScript 语句来隐藏window.navigator.webdriver的值:

Object.defineProperty(navigator, 'webdriver', {get: () => undefined    })

我骂了这种方式为掩耳盗铃,是因为他们是在网页已经加载完毕以后才运行这段 JavaScript 代码的,可此时网站自身的 js 程序早就已经通过读取window.navigator.webdriver知道你现在使用模拟浏览器,你隐藏了又有什么用呢?

所以即使要执行这段 JavaScript 语句,也应该是在浏览器运行网站自带的所有 JavaScript 之前。

这也就是我们现在的方案。

可能有读者会认为,是不是通过写 Chrome 浏览器的插件,让插件里面的 JavaScript 语句在网站页面刚刚打开,还没有运行自带的 JavaScript 之前运行。

这种方式虽然可以解决问题,但稍显麻烦,我们今天的方法非常简单。就是使用 Google 的Chrome Devtools-Protocol(Chrome 开发工具协议)简称CDP

我们打开 CPD 的官方文档[1],可以看到如下的命令:


在每个Frame 刚刚打开,还没有运行 Frame 的脚本前,运行给定的脚本。

通过这个命令,我们可以给定一段 JavaScript 代码,让 Chrome 刚刚打开每一个页面,还没有运行网站自带的 JavaScript 代码时,就先执行我们给定的这段代码。

那么如何在 Selenium 中调用 CDP 的命令呢?实际上非常简单,我们使用driver.execute_cdp_cmd。根据 Selenium 的官方文档[2],传入需要调用的 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 可以使用今天的方法,但不能用老方法。正应了那句话:

上帝给你关上一扇门的时候,悄悄为你开了一扇窗。

虽然使用以上代码就可以达到目的了,不过为了实现更好的隐藏效果,大家也可以继续加入两个实验选项:

from selenium import webdriveroptions = webdriver.ChromeOptions()options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=options, executable_path='./chromedriver')driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """    Object.defineProperty(navigator, 'webdriver', {      get: () => undefined    })  """})driver.get('http://exercise.kingname.info')

公众号粉丝突破50000时,解锁 Pyppeteer 最新隐藏window.nativator.webdriver的方法。

参考资料

[1]

CPD 的官方文档: https://chromedevtools.github.io/devtools-protocol/tot/Page#method-addScriptToEvaluateOnNewDocument

[2]

官方文档: https://www.selenium.dev/selenium/docs/api/py/webdriver_chrome/selenium.webdriver.chrome.webdriver.html#selenium.webdriver.chrome.webdriver.WebDriver.execute_cdp_cmd

chrome webdriver_(最新版)如何正确移除Selenium中的 window.navigator.webdriver相关推荐

  1. webdriver原理_(最新版)如何正确移除 Pyppeteer 中的window.navigator.webdriver

    摄影:产品经理春天来了~ 在<在Pyppeteer中正确隐藏window.navigator.webdriver >一文中,我们介绍了修改源代码使Pyppeteer 打开的 Chrome ...

  2. 移除Selenium的浏览器window.navigator.webdriver等20多个指纹特征

    Selenium特征指纹 一般Selenium自动打开浏览器后,会给其增加一些特征指纹,如下图: 怎样才能去掉这些特征呢? 有一种现成的nodejs库puppeteer-extra,这里面有一个ext ...

  3. chrome webdriver_网络爬虫之使用pyppeteer替代selenium完美绕过webdriver检测 阅读目录

    1 引言 曾经使用模拟浏览器操作(selenium + webdriver)来写爬虫,但是稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很 ...

  4. VS Code 报Windows找不到文件‘chrome‘. 请确定文件名是否正确后,再试一次。八种解决办法

    如果已经处理过类似问题,没有成功的,为节约大家时间,请直接看本文第三部分:三 本人解决方案 如果想了解解决过程,可重头看或重点看. 目录 一 错误描述 二 网上七种解决办法: 1.如何设置默认浏览器. ...

  5. android设置tls版本,Android O移除HttpsURLConnection中不安全的TLS版本回退

    原标题:Android O移除HttpsURLConnection中不安全的TLS版本回退 为提高安全性,在 Android O 中,已从 HttpsURLConnection 中移除不安全的 TLS ...

  6. 移除map中的键值对

    背景 实现 A little bit of progress every dayCome on 背景 项目中需要移除map集合中对应的键值对,用以控制数据的变化. 实现 这里我写了一个测试方法,通过打 ...

  7. R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图、使用subset函数、使用drop_na函数

    R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图.使用subset函数.使用drop_na函数 目录

  8. pandas使用select_dtypes函数移除dataframe中指定数据类型的数据列(exclude columns based on the data type in dataframe)

    pandas使用select_dtypes函数移除dataframe中指定数据类型的数据列(exclude columns based on the data type in dataframe) 目 ...

  9. R语言ggplot2可视化移除图例中的a字符实战

    R语言ggplot2可视化移除图例中的a字符实战 目录 R语言ggplot2可视化移除图例中的a字符实战

最新文章

  1. 额,看房没戴头盔,损失二十万 。。。
  2. 汽车电子嵌入式技术篇(二) -autosar中的嵌入式系统函数的调用
  3. python缩进说法_【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。...
  4. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...
  5. 互联网公司忽悠员工的黑话,套路太深了。
  6. linux中如何批量修改文件名
  7. 解决WINDOWS 7中显示摄像头的简易方法
  8. C++基础——简单而强大的bitset
  9. 原码、反码、补码、移码的换算关系
  10. Swift 5 闭包Closure简明教程
  11. 教你如何下载抖音视频的背景音乐?是音乐不是视频哦
  12. python的bytes数据类型
  13. yum是干什么的_linux下的yum命令详解
  14. 光速类有哪些最新发表的毕业论文呢?
  15. 周纪五 赧王下四十三年(己丑、前272)——摘要
  16. 《操作系统-真象还原》08. 内存管理系统
  17. Bookpedia for Mac(图书收藏管理软件)
  18. SpringBoot导出数据到Excle中
  19. 领导说,不懂汇报,怎么给你升职?让我学习麦肯锡的:金字塔原理、MECE法则...
  20. word中 插入好看高亮的java/c++代码

热门文章

  1. [NOIP2010提高组]关押罪犯
  2. poj 2503 Trie树
  3. 【翻译】使用Ext JS设计响应式应用程序
  4. JAVA学习笔记——JAVA基础语法之精华
  5. [计算机网络][HTTP]
  6. 服务器重装后怎么装系统,服务器如何安装系统,小编教你如何安装
  7. 从html到pug模板,将变量从html-webpack-plugin传递到pug模板
  8. python可以开发exe软件吗_python能开发exe软件吗
  9. 鸿蒙系统太烂,一加终于觉醒!变相承认系统太烂,魅族的吐槽一针见血
  10. php对话框制作,织梦系统“提示窗口对话框类”详解,oxwindow.class.php、catalog_do.php...