我无法使用无头模式在 Google Chrome 中使用当前安装的扩展程序。有什么办法可以启用它们吗?
检查扩展是否有效的一种简单方法是添加“Comic Sans Everything”扩展。
所以谷歌看起来像这样:
但是,如果我使用无头模式对页面进行截图(
google-chrome --headless --disable-gpu --screenshot https://www.google.com
),结果是:
您可以使用 Xvfb 运行带有无头扩展的 Chrome。
sudo dnf install xorg-x11-server-Xvfb
xvfb-run google-chrome --remote-debugging-port=9222 --disable-gpu https://www.google.com
更复杂,但确实有效。这是我们用于无头 chrome 扩展测试的工具。
编辑:这个答案不再正确,请参阅https://stackoverflow.com/a/73079789/934239
不,这是不可能的,并且由于任务的复杂性,Chrome 开发者决定在不久的将来不再实现它。
如果您查看该问题,您可能会认为由于 ChromeDriver 要求,他们仍在考虑它 - 但他们决定让 ChromeDriver 在没有扩展的情况下工作(通过 DevTools)。
pyvirtualdisplay
在服务器上以零显示运行 chrome。最好的事情是你可以使用这个技巧来运行扩展。这是我的实现:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
chrome_options = Options()
chrome_options.add_extension("proxy.zip")
driver = webdriver.Chrome(
executable_path='/usr/bin/chromedriver',
chrome_options=chrome_options
)
time.sleep(3)
driver.get("https://ipinfo.io/json")
print(driver.page_source)
driver.close()
display.stop()
您需要在您的服务器/机器上安装xvfb
:
sudo apt install -y xvfb
pip install pyvirtualdisplay
在我的 AWS 服务器上运行它
options.add_argument("--headless=new")
否,headless模式下的google-chrome尚不支持扩展。
在他的评论中明确提到:
我们决定暂时不在无头模式下实现扩展支持,因为支持所有必需的功能相当复杂您可以在
在他的评论中提到了实时问题:
无论哪种方式,由于 (1),扩展程序可能都必须进行调整才能与无头 Chrome 一起使用。因此,即使我们解决了(2),大多数现有的扩展也将不兼容。 (这也使得 headless chrome 不适合测试 chrome 扩展。)而且,在他的扩展可以提供给 headless chrome 的大多数(如果不是全部)功能都可以通过 headless 向用户公开的 DevTools API 来实现。如果您的用例不受 DevTools API 支持,请提交功能请求。
明确提到:
我意识到很多人都想使用无头扩展,但不幸的是这是一个大项目,我们/没有计划做/。问题是 Headless Chromium 是一个内容嵌入器,这意味着它无法访问其他内容嵌入器(例如 chrome)的任何内容,不幸的是扩展是 chrome 功能。在另一条
评论中,他进一步补充道,如果您通过DevTools使用Selenium,则可以构建代理。您可以通过 Network.setRequestInterception 和 Network.continueInterceptedRequest 过滤 URL 并修改标头。
https://github.com/php-webdriver/php-webdriver/blob/2ed6645812603b20a7a249d4a66e286eb407300c/lib/Chrome/ChromeOptions.php#L83
phpdoc 读取
/**
* Add a Chrome extension to install on browser startup. Each path should be
* a packed Chrome extension.
*
* @param array $paths
* @return ChromeOptions
*/
public function addExtensions(array $paths)