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

《在Pyppeteer中正确隐藏window.navigator.webdriver 》一文中,咱们介绍了修改源代码使Pyppeteer 打开的 Chrome 隐藏window.navigator.webdriver的方法。html

然而时过境迁,随着 Chrome 版本升级,这一方法也宣告失效。python

在前几天的文章《(最新版)如何正确移除Selenium中的 window.navigator.webdriver 》咱们介绍了在 Selenium 中如何隐藏最新版 Chrome 的window.navigator.webdriver的方法。今天咱们来说讲如何隐藏Pyppeteer。git

今天的方法很是简单,不须要修改源代码。github

你们阅读 Selenium 版的文章,应该看到咱们的原理是经过 CDP 执行一段 JavaScript 代码。这段代码中有一个关键词叫作addScriptToEvaluateOnNewDocument。表示添加一段脚本,在打开新文档时执行。web

咱们记住这个关键词EvaluateOnNewDocument。如今你们打开 Pyppeteer 的官方 API,搜索evaluateOnNewDocument能够看到原来 Pyppeteer 也是支持这个功能的。app

这样一来文件就很是简单了,咱们在 Pyppeteer 里面直接调用它,并传递 JavaScript 代码就行了:less

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(executablePath='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', headless=False)
    page = await browser.newPage()
    await page.evaluateOnNewDocument('''() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) } ''')
    await page.goto('http://exercise.kingname.info')
    input('检查完毕后按下回车键关闭窗口...')
    await browser.close()


asyncio.run(main())
复制代码

代码的运行效果以下图所示:async

完美解决问题。而且只要你不开新的选项卡或者新的窗口,只在当前窗口打开新的网址或者刷新页面,这个 js 代码都是自动生效的,不须要重复执行。函数

其中关键的代码就是:网站

await page.evaluateOnNewDocument('''() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) } ''')
复制代码

让 Pyppeteer 在每一个新页面加载的时候,全部网站自带的 js 执行以前,执行参数中的这段JavaScript 函数。

相关文章
相关标签/搜索