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

8e32d3317fe5b0f3ecc7fd5cb3f89e4a.png

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

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

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

7a0a95a98ade90c3b18e3d92f358cecd.png

针对最新版本的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],可以看到如下的命令:

faeedeca50e9368e679d69a85f0aa838.png

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

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

那么如何在 Selenium 中调用 CDP 的命令呢?实际上非常简单,我们使用driver.execute_cdp_cmd。根据 Selenium 的官方文档[2],传入需要调用的 CDP 命令和参数即可:

ac1ac055dac609b374320a7de1cee1bb.png

于是我们可以写出如下代码:

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')

运行效果如下图所示:

37abee38e3b310e23bc76b015d94de08.png

完美隐藏window.navigator.webdriver。并且,关键语句:

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})

只需要执行一次,之后只要你不关闭这个driver开启的窗口,无论你打开多少个网址,他都会自动提前在网站自带的所有 js 之前执行这个语句,隐藏window.navigator.webdriver

如果有人运行上面的代码,出现如下报错:

fc623d2d793fc9f138ce8833454e5f8e.png

那么请升级你的 ChromeDriver。老版本的 Chrome + ChromeDriver 只能用以前的方法,不能用今天的方法。新版本的 Chrome + ChromeDriver 可以使用今天的方法,但不能用老方法。正应了那句话:

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

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

from selenium import webdriver
options = 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

cdb69cbe520ca8fd4f1a34cb6465e5e5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】2.3async中必须始终返回Task(@Ron.liang)

Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章 目录 前言1. 异常的发生来得太突然2. 问题所在3. 问题的解决方案前言 事情的起因是由于一段简单的数据库连接代码引起,这段代码从语法上看,是没有任何问题;但是就是莫名其妙的报…

Qt事件传递相关问题

事件传递 涉及到深层次窗口结构或者窗口封装时,经常会遇到上层窗口接收不到事件的问题。排除这类问题需要了解窗口间的事件传递过程。 应用程序产生事件时,事件会先派发给父窗口,由父窗口在内部派发给子窗口,子窗口会进一步传递…

tableau 实战练习数据源分享_小白入行数据分析师3年-工作内容复盘分享含代码(二)-数据库及Tableau篇介绍...

前言本文是对使用的数据库以及Tableau的内容进行介绍,方便学习者了解数据库方向有哪些内容是需要有所了解以及可以注意的,分享内容基于个人对这些技能的理解,如有错误请及时指出,我会立马改进。数据库篇数据库这边,我的…

php隐藏webshell_PHP 安全的十个必备技巧

在这篇文章中,我将尝试为你提供一些可以提高 PHP 应用程序安全性的具体步骤。我关注的是 PHP 配置本身,所以我们不会讨论 SQL 注入、HTTPS 或其他与 PHP 无关的问题。我将使用我的 docker-entrypoint.sh 脚本中的 bash 行来说明示例,但当然你…

【转】WebSocket协议:5分钟从入门到精通

一、内容概览 由于WebSocket的出现,使得浏览器也具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket建立连接、交换数据的细节,以及数据帧的格式。此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御…

Qt填坑

Q_ASSERT里面不要放需要执行的语句,否则release下此语句不会被执行。父类中含Q_OBJECT,子类并不能使用信号槽机制,子类也需要加Q_OBJECT。QStringLiteral只能在Qt 5及以上版本中使用,低版本不支持。如果需要Qt 5及以上版本的代码放…

aop实现原理_Java:由浅入深揭开 AOP 实现原理

点击上方“Java专栏”,选择“置顶或者星标”第一时间阅读精彩文章!1、☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜2、☞ 《Java面试手册》.PDF 点击查看作者:马佩juejin.im/post/5bf4fc84f265da611b57f906概述&a…

Git学习资料

Git使用简易指南官方手册Git北京Git工作流

【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解

阅读目录 一、get请求 1、基础类型参数2、实体作为参数3、数组作为参数4、“怪异”的get请求二、post请求 1、基础类型参数2、实体作为参数3、数组作为参数4、后台发送请求参数的传递三、put请求 1、基础类型参数2、实体作为参数3、数组作为参数四、delete请求五、总结正文 前…

python代码实例sicket_Python socket聊天脚本代码实例

这篇文章主要介绍了Python socket聊天脚本代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 没有前端,多开了一条线程用于接收信息。 服务器端: # -*- coding:utf-8 -*- import so…

【转】01Teams的前世今生

说到Teams,这到底是一个什么产品?有人说它是团队协作工具,有人说它是云视频系统,有人说它是Hub,还有人说它是微软有史以来发展最快的一个产品,还有人说它完全是一个高效办公神器。其实都是对的。 Teams集成…

编辑器推荐:Visual Studio Code(VSCode/VSC)

简介 Visual Studio Code(以下简称vscode),是微软的一款轻量且强大的编辑器,支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来…

oracle insert 当前时间_Oracle知识点总结

目录1、Oracle的安装与下载2、基础查询3、条件查询 1)对比运算符 2)逻辑运算符 3)模糊查询 4)排序4、函数 1)数值函数 2)字符函数 3)时间日期函数 4)转换函数 5)通用函数5、聚合函数6、分组查询在学习Oracle之前,需要先有一定的数据库基…

【转】C#各类控件的输入输出(思维导图、知识点分析、案例解析)

第六周学习笔记—C#各类控件的输入输出 1.思维导图 知识点汇总: 着重介绍几个常用控件: 数据显示控件 DataGridView控件 列设置 a)、列的宽度铺满这个控件 设置如下:把AutoSizeColumnsModeFill;//可以在属性窗口中设置 b)、列名居中 代…

Windows下创建软硬链接

定义 硬链接:只要文件本身或者任意一个硬链接存在,则文件始终存在。 软链接:只要源文件存在,则符号链接有效;源文件不存在,符号链接无效。软链接,用符号S表示,可以代表Soft&#x…

sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库

(给DotNet加星标,提升.Net技能)转自:Ron.liangcnblogs.com/viter/p/10243577.html前言在 .NET Core 2.2中Microsoft.AspNetCore.App 默认内置了EntityFramework Core 包,所以在使用过程中,我们无需再从NuGet仓库单独应用 EFCore 包…

【转】ADO.Net之SqlConnection、 Sqlcommand的应用学习心得(思维导图,知识解析,案例分析)

ADO.Net之SqlConnection、 Sqlcommand的应用 一、思维导图: ADO.NET与SQL连接: 二、知识点介绍: SqlConnection和Sqlcommand都是组成数据提供程序的类。 SqlConnection使用它来建立和数据库的连接,Sqlcommand使用它执行SQL命令…

进度类应用程序设计

任务管理 待续 进度实现设计 如常见的下载进度,上传进度。 以Qt为例,至少需要实现三个信号: sigTaskStarted(const struct TaskInfo &) sigTaskProgress(const struct TaskInfo &, int progress) sigTaskFinished(const struct T…

professional中文_Microsoft office 2007 简体中文版

点击蓝字 关注小白软件名称:Microsoft office 2007软件语言:简体中文软件大小:0.67GB安装环境:Win10/8/7下载链接:https://pan.baidu.com/s/1DybozQ-rn-t2s2EC7FrvFw 提取码:zoa0安装步骤1、解压安装包&…

【转】设计模式 ( 十七) 状态模式State(对象行为型)

设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。…