是否可以通过扩展在无头模式下运行 Google Chrome?

问题描述 投票:0回答:10

我无法使用无头模式在 Google Chrome 中使用当前安装的扩展程序。有什么办法可以启用它们吗?

检查扩展是否有效的一种简单方法是添加“Comic Sans Everything”扩展。

所以谷歌看起来像这样:

但是,如果我使用无头模式对页面进行截图(

google-chrome --headless --disable-gpu --screenshot https://www.google.com
),结果是:

google-chrome google-chrome-extension google-chrome-headless
10个回答
47
投票

您可以使用 Xvfb 运行带有无头扩展的 Chrome。

  1. 安装Xvfb。在 Fedora 上
    sudo dnf install xorg-x11-server-Xvfb
  2. xvfb-run google-chrome --remote-debugging-port=9222 --disable-gpu  https://www.google.com
  3. 使用 chrome-remote-interface(或其他 Chrome 调试协议客户端)触发屏幕截图。

更复杂,但确实有效。这是我们用于无头 chrome 扩展测试的工具。


46
投票

编辑:这个答案不再正确,请参阅https://stackoverflow.com/a/73079789/934239

不,这是不可能的,并且由于任务的复杂性,Chrome 开发者决定在不久的将来不再实现它。

如果您查看该问题,您可能会认为由于 ChromeDriver 要求,他们仍在考虑它 - 但他们决定让 ChromeDriver 在没有扩展的情况下工作(通过 DevTools)。


20
投票
由于最近无头模式的变化,如果您遇到问题,您可能需要使用

--headless=new

 而不是 
--headless=chrome

options.add_argument("--headless=new")
编辑:

https://www.selenium.dev/blog/2023/headless-is-going-away/


16
投票
您可以使用

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 服务器上运行它


15
投票
实际上它现在可以工作了,他们修复了它。 你可以用

options.add_argument("--headless=chrome")
就像魅力一样。

https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c36


3
投票
options.add_argument("--headless=chrome") 有效


3
投票
我试过了,效果很好!

options.add_argument("--headless=new")
    

2
投票

headlessgoogle-chrome

[email protected]

在他的
评论中明确提到:

我们决定暂时不在无头模式下实现扩展支持,因为支持所有必需的功能相当复杂

您可以在

添加对无头chrome的扩展支持中找到完整的分析

[email protected]

在他的
评论中提到了实时问题:

    许多扩展 API 特定于非无头浏览器,因此在无头 Chrome 中不受支持。
  1. 在我们可以支持的 API 中,只有部分 API 的实现方式是我们目前可以将它们重用于 headless chrome 的。
  2. 改变这一点需要大量的重构,考虑到我们获得的好处,这似乎并不合理。
他进一步补充说,

无论哪种方式,由于 (1),扩展程序可能都必须进行调整才能与无头 Chrome 一起使用。因此,即使我们解决了(2),大多数现有的扩展也将不兼容。 (这也使得 headless chrome 不适合测试 chrome 扩展。)

扩展可以提供给 headless chrome 的大多数(如果不是全部)功能都可以通过 headless 向用户公开的 DevTools API 来实现。如果您的用例不受 DevTools API 支持,请提交功能请求。

而且,在他的

评论中,[email protected]

明确提到:

我意识到很多人都想使用无头扩展,但不幸的是这是一个大项目,我们/没有计划做/。问题是 Headless Chromium 是一个内容嵌入器,这意味着它无法访问其他内容嵌入器(例如 chrome)的任何内容,不幸的是扩展是 chrome 功能。

在另一条

评论中,他进一步补充道,如果您通过DevTools使用Selenium,则可以构建代理。您可以通过 Network.setRequestInterception Network.continueInterceptedRequest 过滤 URL 并修改标头。


0
投票
我还没试过,但看看这个

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)
    

0
投票
如果 options.add_argument("--headless=chrome") 不适合你,你可以使用 pyvirtualdisplay。首先使用 pip 安装 pyvirtualdisplay 并在 Linux 机器上运行

apt-get install xvfb

。
您可以在这里找到如何使用 pyvirtualdisplay 
https://github.com/ponty/PyVirtualDisplay

并且您需要从 ChromeOptions 中删除 --headless 参数。

© www.soinside.com 2019 - 2024. All rights reserved.