Как пройти экспериментальные chrome вариантов в кукольнике - PullRequest
1 голос
/ 12 июля 2020

У меня есть приложение, написанное на 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)

Мне нужно перенести то же приложение для узла / кукловода , но я не уверен, как передать экспериментальные параметры в 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?

1 Ответ

1 голос
/ 13 июля 2020

I.) Обычно вы должны иметь возможность установить любые экспериментальные функции среди args, если вы можете разместить их между флагами --flag-switches-begin и --flag-switches-end и указать их в следующем формате: Pascal имена опций регистра, разделенные одной запятой без пробела. Например, если вы хотите установить enable-nacl и network-service:

--enable-features=EnableNacl,NetworkService

Здесь можно проверить экспериментальные возможности: chrome: // флаги , если они действительно включены.

Командная строка Chrome / Chromium может быть проверена здесь: chrome: / / version , чтобы увидеть, добавляются ли флаги при запуске.

II.) Для меня это решение не сработало (это не значит, что оно не сработает для вас, стоит попробовать). Поэтому я использую обходной путь создания профиля Chrome (экспериментальный профиль 1), где я включаю вручную экспериментальные флаги, а затем использую этот профиль с кукловодом (требуются --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: // версия .

Примечание 2: Приведенный выше пример может быть запущен только с headless: false, поскольку безголовый режим не может посещать недопустимые 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 политики по адресу chrome : // policy page. Убедитесь, что вы установили Показать политики без установленного значения , чтобы их увидеть.

Но, насколько я понимаю, это не обеспечивает простого решения (например, в случае Windows вы можете установить его только через реестр). После поиска на GitHub я обнаружил в этом обсуждении , что chrome_options.add_experimental_option не реализован в кукольнике, как в 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

...