pyppeteer控制Chromium在隱身模式下啟用插件


基礎

啟用隱身模式

from pyppeteer import launch


async def start_browser():
    browser = await launch(**{"headless": False})
    browser_context = await browser.createIncognitoBrowserContext()
    page = await browser_context.newPage()

    await page.goto("http://www.baidu.com")
    await browser.close()
    return


非隱身模式啟用插件

from pyppeteer import launch


async def start_browser():
    chrome_extension_path = "插件所在目錄"
    args = [
        "--load-extension={}".format(chrome_extension_path),
        "--disable-extensions-except={}".format(chrome_extension_path),
    ]

    browser = await launch(**{"headless": False, "args": args})
    page = await browser.newPage()

    await page.goto("http://www.baidu.com")
    await browser.close()
    return

正文

如果是非隱身模式啟用插件的話,上面的代碼就可以了。但很蛋疼的是,有個場景必須得在隱身模式下運行,還需要插件。如果是人為操作的話,啟用步驟如下:

  1. 打開插件管理頁面 chrome://extensions/
  2. 找到需要啟動的插件,點擊詳細信息,進入插件詳情。
  3. 在詳情中尋找: 在無痕模式下啟用的選項並勾選

然后就可以在隱身模式下使用了。

BUT,我的目的是自動隱身模式下啟用插件。Google大法開始啟用。。。
一個小時后。。。WTF,反正我是沒找到正常的實現方式,貌似pyppeteer不支持,不知道是不是有什么隱藏的chrome參數能用的,但找起來太費勁了,放棄。

其實在Google過程中也找到了一個辦法,只是不那么優雅而已。其實很簡單,就是把上面人為操作的步驟自動化一下。

代碼並不是很復雜,不過在實現過程中還是學到了點新東西的。

代碼如下:

import asyncio
from pyppeteer.browser import Browser


async def enable_extension_for_incognito(browser: Browser, extension_name: str) -> bool:
    """
        在隱身模式下啟用指定插件
    Args:
        extension_name: 插件名稱

    Returns:

    """
    # 新開非隱身窗口並打開擴展程序頁面
    page = await browser.newPage()
    await page.goto("chrome://extensions/")
    # 執行js代碼獲取指定的擴展id
    get_eid_js = (
        """() => {
        var extension_id;
        document.querySelector("extensions-manager").shadowRoot
        .querySelector("extensions-item-list").shadowRoot
        .querySelectorAll("extensions-item").forEach(function (e) {
            var e_name = e.shadowRoot.querySelector("#name").textContent.trim();
            if (e_name == "%s") {
                extension_id = e.getAttribute("id")
            }
        })
        return extension_id
    }"""
        % extension_name
    )
    extension_id = await page.evaluate(get_eid_js)
    await asyncio.sleep(1)
    # 進入擴展詳情頁面
    await page.goto("chrome://extensions/?id={}".format(extension_id))
    # 判斷插件是否啟用
    get_extension_status_js = """
                    () => {
                    return document.querySelector("extensions-manager").shadowRoot
                    .querySelector("extensions-detail-view").shadowRoot
                    .querySelector("extensions-toggle-row#allow-incognito").shadowRoot
                    .querySelector("#crToggle").getAttribute("aria-pressed")
                    }
                    """
    r = await page.evaluate(get_extension_status_js)
    if r != "true":
        # 點擊在無痕模式下啟用
        click_enable_js = """
        () => {document.querySelector("extensions-manager").shadowRoot
        .querySelector("extensions-detail-view").shadowRoot
        .querySelector("extensions-toggle-row#allow-incognito").shadowRoot
        .querySelector("#crToggle").shadowRoot
        .querySelector("button").click()}
        """
        await page.evaluate(click_enable_js)
        await asyncio.sleep(1)
    # 確認是否啟用成功
    r = await page.evaluate(get_extension_status_js)
    assert r == "true"
    await page.close()
    return True

需要注意的地方有兩個:

  1. shadowRoot這個東西第一次遇到。。。
  2. 瀏覽器有記憶功能。如果你已經啟用了某個插件,那么之后再打開的時候插件就已經是啟用狀態了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM