【问题标题】:How to pass experimental chrome options in puppeteer如何在 puppeteer 中通过实验性 chrome 选项
【发布时间】:2020-07-12 16:36:53
【问题描述】:

我有一个用 python/selenium 编写的应用程序,它在chrome driver 上设置了一些实验选项:

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

【问题讨论】:

    标签: python node.js selenium selenium-chromedriver puppeteer


    【解决方案1】:

    I.) 通常你应该能够在args 中设置任何实验性功能,如果你能够将它们定位在--flag-switches-begin--flag-switches-end 标志之间并且你以以下格式给出它们: Pascal 大小写选项名称,用一个逗号分隔,不带空格。 例如。如果要设置enable-naclnetwork-service

    --enable-features=EnableNacl,NetworkService
    

    如果确实启用了实验功能,可以在此处检查:chrome://flags

    可以在此处检查 Chrome/Chromium 的 命令行chrome://version 以查看是否在启动时添加了标志。


    II.)对我来说,这个解决方案没有用(这并不意味着它对你不起作用,值得一试)。因此,我使用创建 Chrome 配置文件(实验配置文件 1)的解决方法,在其中启用 manually 实验标志,然后将此配置文件与 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,请参阅更多平台和更多信息here

    注意:您可以在chrome://version 页面上检索可执行文件和配置文件路径。

    注意 2: 上面的示例只能在 headless: false 下运行,因为无头模式无法访问像 chrome://flags/#enable-nacl 这样的无效 URL,但是用户配置文件应该可以工作。如果不是,则存在与数据目录的相对路径相关的已知 chromium 错误,可以使用path.resolve 解决,例如:

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

    [source]


    编辑

    实际上,您要设置的选项仅被ChromeDriver 称为实验选项,但可在chrome://policy 页面上作为chrome 策略使用。确保您已设置显示未设置值的策略以查看它们。

    但据我所知,它并没有提供简单的解决方案(例如,在 Windows 的情况下,您只能通过注册表进行设置)。在 GitHub 上搜索后,我在 this discussion 中发现 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

    【讨论】:

    • 感谢您的回答。不幸的是,第一种方法对我也不起作用,第二种方法也不能用,因为我需要无头自动化
    • 我明白了。很抱歉与第二种解决方案混淆,我认为它甚至可以在无头模式下工作:我的意思是我的特定示例脚本不能无头运行,但如果您使用的是完整(非相对)--user-data-dir 路径,则实验功能可以是也设置在无头镀铬上。也值得一试。
    • 好的,我正在尝试在新的 Chrome 配置文件上设置一些实验性标志...问题出在 chrome://flags 我找不到任何需要设置的实验性选项,例如download_restrictionsprompt_for_download。您知道我在哪里可以找到它们并保存在配置文件中,以便我可以尝试在 puppeteer 中加载配置文件吗?
    • 实际上这两个不是实验性选项,而是 chrome 策略,可在 chrome://policy/ 页面找到。确保您已设置_显示未设置值的政策_以查看它们。仅供参考:prompt_for_download 现在被称为 PromptForDownloadLocation
    • 更新: 但据我所知,它并没有提供简单的解决方案(例如,在 Windows 的情况下,您只能通过注册表进行设置)。在 GitHub 上搜索后,我发现 chrome_options.add_experimental_option 在 puppeteer 中没有像在 ChromeDriver 中那样实现:github.com/puppeteer/puppeteer/issues/1693 但在 puppeteer-extra 中有一个专用插件,称为:user-preferences。我会用这个更新我的答案。
    猜你喜欢
    • 2021-07-24
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多