rev*_*evy 5 python selenium node.js selenium-chromedriver 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)
Run Code Online (Sandbox Code Playgroud)
我需要将相同的应用程序移植到节点/ 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);
})();
Run Code Online (Sandbox Code Playgroud)
是否可以将 Chrome 实验选项传递给puppeteer?
I.) 通常,args如果您能够将它们放置在--flag-switches-begin和--flag-switches-end标志之间,并且按以下格式给出它们,那么您应该能够在 中设置任何实验性功能:Pascal 大小写选项名称,用单个逗号分隔,不带空格。
例如,如果您想设置enable-nacl和network-service:
--enable-features=EnableNacl,NetworkService
Run Code Online (Sandbox Code Playgroud)
可以在此处检查实验功能:chrome://flags如果确实启用了它们。
可以在此处检查 Chrome/Chromium 的命令行:chrome : //version以查看启动时是否添加了标志。
II.)对我来说这个解决方案不起作用(这并不意味着它对你不起作用,值得一试)。因此,我使用创建 Chrome 配置文件(实验配置文件 1)的解决方法,在其中手动启用实验标志,然后将此配置文件与 puppeteer 一起使用(--user-data-dir=并且--profile-directory=是必需的):
--enable-features=EnableNacl,NetworkService
Run Code Online (Sandbox Code Playgroud)
上面的示例适用于 Windows,请在此处查看更多平台和更多信息。
注意:您可以在chrome://version页面上检索可执行文件和配置文件路径。
注意 2:上面的示例只能在无头模式下运行,headless: false因为无头模式无法访问无效的 URL,例如chrome://flags/#enable-nacl,但用户配置文件应该可以工作。如果不是,则存在与数据目录的相对路径相关的已知 chromium bug,可以使用 解决path.resolve,例如:
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()
Run Code Online (Sandbox Code Playgroud)
实际上,您要设置的选项仅被ChromeDriver称为实验性选项,但可以在chrome://policy页面作为 chrome 策略使用。确保您已设置“显示策略”但未设置任何值才能查看它们。
但据我所知,它并没有提供一个简单的解决方案(例如,在 Windows 中,您只能通过注册表进行设置)。在 GitHub 上搜索后,我发现此讨论并未chrome_options.add_experimental_option像 ChromeDriver 那样在 puppeteer 中实现。但在puppeteer-extra中有一个专门的插件,称为:user-preferences。
例如:
const path = require('path')
const browser = await puppeteer.launch({ headless: true, args: [`--user-data-dir=${path.resolve(__dirname, 'User Data') }`] })
Run Code Online (Sandbox Code Playgroud)
首选项名称及其访问的参考:https://chromium.googlesource.com/chromium/src/+/master/chrome/common/pref_names.cc