![](/img/trans.png)
[英]Name mapping between Chrome policies and Chrome experimental options in Selenium python
[英]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-nacl
和network-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.