(最新版)如何正確移除 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 函數。

相關文章
相關標籤/搜索