簡體   English   中英

如何在 puppeteer 中通過實驗性 chrome 選項

[英]How to pass experimental chrome options in puppeteer

我有一個用 python/ selenium編寫的應用程序,它在chrome 驅動程序上設置了一些實驗選項:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--lang=en')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-browser-side-navigation')
chrome_options.add_argument('--mute-audio')
chrome_options.add_argument('--headless')

chrome_options.add_experimental_option(
    'prefs', {
        'intl.accept_languages': 'en,en_US',
        'download.prompt_for_download': False,
        'download.default_directory': '/dev/null',
        'automatic_downloads': 2,
        'download_restrictions': 3,
        'notifications': 2,
        'media_stream': 2,
        'media_stream_mic': 2,
        'media_stream_camera': 2,
        'durable_storage': 2,
        'plugins': 2,
        'popups': 2,
        'site_engagement': 2,
        'midi_sysex': 2,
        'mouselock': 2,
        'geolocation': 2,
    }
)

driver = webdriver.Chrome(options=chrome_options)

我需要將相同的應用程序移植到 node/ puppeteer但我不確定如何將實驗選項傳遞給puppeteer/chromium

const puppeteer = require('puppeteer');

(async () => {

    const options = {
        headless: true,
        args: [
            '--disable-gpu',
            '--no-sandbox',
            '--lang=en',
            '--disable-dev-shm-usage',
            '--disable-browser-side-navigation',
            '--mute-audio',
        ],
    };

    // experimental options ??

    const browser = await puppeteer.launch(options);

})();

是否可以將 Chrome 實驗選項傳遞給puppeteer

I.) 通常,如果您能夠在--flag-switches-begin--flag-switches-end標志之間對它們進行 position 並以以下格式提供它們,則通常您應該能夠在args中設置任何實驗性功能: Pascal 大小寫選項名稱,由一個逗號分隔,不帶空格。 例如,如果你想設置enable-naclnetwork-service

--enable-features=EnableNacl,NetworkService

如果確實啟用了實驗功能,可以在此處檢查: chrome://flags

可以在此處檢查 Chrome/Chromium 的命令行chrome://version以查看是否在啟動時添加了標志。


II.)對我來說,這個解決方案沒有用(這並不意味着它對你不起作用,值得一試)。 因此,我使用創建 Chrome 配置文件(實驗配置文件 1)的解決方法,在其中手動啟用實驗標志,然后將此配置文件與 puppeteer 一起使用(需要--user-data-dir=--profile-directory= ):

const puppeteer = require('puppeteer')

async function fn() {
  const browser = await puppeteer.launch({
    headless: false,
    args: [
      // '--enable-features=EnableNacl,NetworkService',
      '--user-data-dir=C:\\Users\\user.name\\AppData\\Local\\Chromium\\User Data',
      '--profile-directory=Experimental Profile 1'
    ]
  })
  const page = await browser.newPage()

  await page.goto('chrome://flags/#enable-nacl')
}
fn()

上面的示例適用於 Windows,請在此處查看更多平台和更多信息。

注意:您可以在chrome://version頁面上檢索可執行文件和配置文件路徑。

注意 2:上面的示例只能在headless: false下運行,因為 headless 模式無法訪問無效 URL,例如chrome://flags/#enable-nacl ,但用戶配置文件應該可以工作。 如果不是,則存在與數據目錄的相對路徑相關的已知鉻錯誤,可以使用path.resolve解決,例如:

const path = require('path')
const browser = await puppeteer.launch({ headless: true, args: [`--user-data-dir=${path.resolve(__dirname, 'User Data') }`] })

[資源]


編輯

實際上,您要設置的選項僅被ChromeDriver稱為實驗選項,但可在chrome://policy頁面上作為 chrome 策略使用。 確保您設置了未設置值的顯示策略以查看它們。

但據我所知,它沒有提供簡單的解決方案(例如,在 Windows 的情況下,您只能通過注冊表進行設置)。 在搜索 GitHub 后,我在此討論中發現chrome_options.add_experimental_option在 puppeteer 中沒有像在 ChromeDriver 中那樣實現。 但是在puppeteer-extra中有一個專門的插件,叫做: user-preferences

例如:

const puppeteer = require('puppeteer-extra')
puppeteer.use(require('puppeteer-extra-plugin-user-preferences')({ userPrefs: {
  download: {
    prompt_for_download: false
  }
}}))
const browser = await puppeteer.launch()

首選項名稱及其訪問權限的參考: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/pref_names.cc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM