59

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

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

所以谷歌看起来像这样:

谷歌看起来很漂亮

但是,如果我使用无头模式 ( google-chrome --headless --disable-gpu --screenshot https://www.google.com) 截取页面,结果是:

谷歌处于无头模式

4

5 回答 5

44

您可以使用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 扩展测试的方法。

于 2017-09-28T18:26:45.193 回答
37

不,这是不可能的,由于任务的复杂性, Chrome 开发人员决定在不久的将来不实施它。

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

于 2017-07-28T11:42:56.603 回答
10

您可以使用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 服务器上运行它

aws 服务器

于 2020-01-17T19:20:57.820 回答
1

模式下的尚不支持扩展。

skyos...@chromium.org在他的评论中明确提到:

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

您可以在Add extension support for headless chrome中找到完整的分析

eseckler@chromium.org在他的评论中提到了实时问题:

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

他进一步补充说,

无论哪种方式,由于(1),扩展可能必须适应无头镀铬。因此,即使我们解决了 (2),大多数现有扩展也将不兼容。(这也导致无头 chrome 不适合测试 chrome 扩展。)

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

而且,在他的评论中,alexclarke@chromium.org明确提到:

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

在另一条评论中,他进一步补充说,如果您通过DevTools使用Selenium ,您可以构建一个代理。您可以通过Network.setRequestInterceptionNetwork.continueInterceptedRequest过滤 URL 和修改标头。

于 2020-06-12T15:25:13.630 回答
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)
于 2021-07-31T00:12:55.193 回答