是否可以在无头模式下使用扩展程序运行Google Chrome?

时间:2017-07-28 11:14:21

标签: google-chrome google-chrome-extension google-chrome-headless

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

检查扩展程序是否有效的简便方法是添加“Comic Sans Everything”扩展程序。

Google就是这样的:

Google looks beautiful

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

Google in headless mode

6 个答案:

答案 0 :(得分:23)

不,这是不可能的,Chrome开发人员decided against implementing it in any near future由于任务的复杂性。

如果你看一下这个问题,你可能会认为他们仍然在考虑ChromeDriver的要求 - 但是他们决定让ChromeDriver无需扩展(通过DevTools)。

答案 1 :(得分:17)

您可以使用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调试协议客户端)触发屏幕截图。
  4. 更复杂,但确实有效。这就是我们用于无头镀铬扩展测试的方法。

答案 2 :(得分:7)

您可以使用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 server

答案 3 :(得分:1)

模式下的目前不支持扩展程序。

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

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

您可以在Add extension support for headless chrome

中找到完整的分析

eseckler@chromium.org在他的comment中提到了以下实时问题:

  1. 许多扩展API专门针对非无头浏览器,因此无头chrome无法支持。
  2. 在我们可能支持的API中,只有某些部分的实现方式使得我们目前可以将其重新用于无头chrome。
  3. 要改变这一点,需要进行大量重构,鉴于我们将获得的好处,这似乎是不合理的。

他进一步补充,

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

扩展(即使不是全部)可以提供给无头chrome的所有功能,也可以通过将无头公开给用户的DevTools API来实现。如果您有DevTools API不支持的用例,请提出功能请求。

此外,在他的comment中,alexclarke@chromium.org明确提到:

我知道很多人都想无头使用扩展,但是不幸的是,这是一个大项目,我们尚无计划/。问题在于Headless Chromium是一个内容嵌入程序,这意味着它无法访问其他内容嵌入程序(例如chrome)中的任何内容,不幸的是扩展是chrome功能。

他进一步在另一个comment中补充说,如果您通过Selenium使用DevTools,则可以构建代理。您可以通过Network.setRequestInterception Network.continueInterceptedRequest过滤URL并修改标题。

答案 4 :(得分: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)

答案 5 :(得分:-1)

使用puppeteer来实现无头的其他使用Chrome的可能性-无头Chrome Node.js API

相关问题