我无法使用无头模式在 Google Chrome 中使用我当前安装的扩展程序。有什么方法可以启用它们吗?
检查扩展是否有效的一种简单方法是添加例如“ Comic Sans Everything ”扩展。
所以谷歌看起来像这样:
但是,如果我使用无头模式 ( google-chrome --headless --disable-gpu --screenshot https://www.google.com
) 截取页面,结果是:
我无法使用无头模式在 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 扩展测试的方法。
不,这是不可能的,由于任务的复杂性, 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 服务器上运行它
不,无头模式下的google-chrome尚不支持扩展。
skyos...@chromium.org
在他的评论中明确提到:
我们决定暂时不在无头模式下实现扩展支持,因为支持所有必需的功能相当复杂
您可以在Add extension support for headless chrome中找到完整的分析
eseckler@chromium.org
在他的评论中提到了实时问题:
他进一步补充说,
无论哪种方式,由于(1),扩展可能必须适应无头镀铬。因此,即使我们解决了 (2),大多数现有扩展也将不兼容。(这也导致无头 chrome 不适合测试 chrome 扩展。)
扩展可以为无头 chrome 提供的大多数功能(如果不是全部)都可以通过无头向其用户公开的 DevTools API 来实现。如果您有 DevTools API 不支持的用例,请提交功能请求。
而且,在他的评论中,alexclarke@chromium.org
明确提到:
我意识到很多人都想使用无头扩展,但不幸的是这是一个我们/没有计划做/的大型项目。问题是 Headless Chromium 是一种内容嵌入器,这意味着它无法访问来自其他内容嵌入器(如 chrome)的任何内容,不幸的是,扩展是 chrome 的一项功能。
在另一条评论中,他进一步补充说,如果您通过DevTools使用Selenium ,您可以构建一个代理。您可以通过Network.setRequestInterception和Network.continueInterceptedRequest过滤 URL 和修改标头。
我没试过,但看看这个
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)