Is het mogelijk om Google Chrome in headless-modus met extensies uit te voeren?

Ik kan mijn momenteel geïnstalleerde extensies niet gebruiken in Google Chrome in de headless-modus. Is er een manier om ze in te schakelen?

Een gemakkelijke manier om te controleren of de extensies werken, is door bijvoorbeeld de “Comic Sans Everything” extensie.

Dus Google ziet er zo uit:

Google ziet er prachtig uit

Als ik echter een screenshot van de pagina maak met de headless-modus (google-chrome --headless --disable-gpu --screenshot https://www.google.com), het resultaat is:

Google in headless-modus


Antwoord 1, autoriteit 100%

Je kunt Chrome zonder hoofd met extensies uitvoeren met Xvfb.

  1. Installeer Xvfb. Op Fedora sudo dnf install xorg-x11-server-Xvfb
  2. xvfb-run google-chrome --remote-debugging-port=9222 --disable-gpu https://www.google.com
  3. Gebruik chrome-remote-interface(of een andere Chrome Debug Protocol-client) om de schermafbeelding te activeren.

Ingewikkelder, maar het werkt wel. Het is wat we gebruiken voor het testen van headless chrome-extensies.


Antwoord 2, autoriteit 84%

Nee, het is niet mogelijk, en Chrome-ontwikkelaars hebben besloten om de implementatie niet te implementeren het in de nabije toekomstvanwege de complexiteit van de taak.

Als je naar dat probleem kijkt, krijg je misschien het idee dat ze het nog steeds overwegen vanwege ChromeDriver-vereisten, maar in plaats daarvan hebben ze besloten om ChromeDriver zonder extensies te laten werken (via DevTools).


Antwoord 3, autoriteit 23%

U kunt pyvirtualdisplaygebruiken om Chrome zonder weergave op uw server uit te voeren. Het beste is dat je extensies kunt uitvoeren door deze truc te gebruiken.

Hier is mijn implementatie:

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()

U moet xvfbop uw server/machine installeren:

sudo apt install -y xvfb
pip install pyvirtualdisplay

Het draait op mijn AWS-server

aws server


Antwoord 4, autoriteit 2%

Nee, in de modus ondersteunt nog geen extensies.

[email protected]in zijn commentaarduidelijk vermeld:

We hebben besloten om voorlopig geen extensieondersteuning in headless-modus te implementeren, omdat het ondersteunen van alle vereiste functies nogal complex is

Je kunt de volledige analyse vinden in

[email protected]in zijn commentaarnoemde de realtime problemen als:

  1. Veel extensie-API’s zijn specifiek voor niet-headless browsers en kunnen dus niet worden ondersteund in headless chrome.
  2. Van de API’s die we mogelijk zouden kunnen ondersteunen, zijn alleen onderdelen zo geïmplementeerd dat we ze momenteel kunnen hergebruiken voor headless chrome.
  3. Om dit te veranderen, is veel refactoring nodig, wat niet gerechtvaardigd lijkt gezien het voordeel dat we zouden behalen.

Hij voegde er verder aan toe,

Hoe dan ook, extensies zouden waarschijnlijk moeten worden aangepast om te werken met headless chrome vanwege (1). Dus zelfs als we (2) zouden oplossen, zouden de meeste bestaande extensies niet compatibel zijn. (Dit maakt headless chrome ook ongeschikt voor het testen van chrome extensions.)

De meeste, zo niet alle functies die extensies zouden kunnen bieden aan headless chrome kunnen worden gerealiseerd via de DevTools API die headless blootstelt aan zijn gebruikers. Als u een gebruiksscenario heeft dat niet wordt ondersteund via de DevTools API, dient u een functieverzoek in.

Bovendien, in zijn commentaar, [email protected]duidelijk vermeld:

Ik realiseer me dat veel mensen extensies willen gebruiken met headless, maar helaas is dat een groot project dat we /geen plannen hebben om te doen/. Het probleem is dat Headless Chromium een ​​content-embedder is, wat betekent dat het geen toegang heeft tot iets van andere content-embedders zoals Chrome en helaas zijn extensies een Chrome-functie.

In een andere opmerkingvoegde hij er verder aan toe: als je Seleniumgebruikt via DevToolsje kunt een proxy bouwen. U kunt URL’s filteren en headers wijzigen via Network.setRequestInterception en Network.continueInterceptedRequest.


Antwoord 5

Ik heb het niet geprobeerd, maar kijk hier eens

https://github .com/php-webdriver/php-webdriver/blob/2ed6645812603b20a7a249d4a66e286eb407300c/lib/Chrome/ChromeOptions.php#L83

phpdoc leest

/**
     * 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)

Other episodes