--headless is not an option in Chrome WebDriver for Selenium
Asked Answered
S

4

9

I would like to have Selenium run a headless instance of Google Chrome to mine data from certain websites without the UI overhead. I downloaded the ChromeDriver executable from here and copied it to my current scripting directory.

The driver appears to work fine with Selenium and is able to browse automatically, however I cannot seem to find the headless option. Most online examples of using Selenium with headless Chrome go something along the lines of:

import os  
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.chrome.options import Options  

chrome_options = Options()  
chrome_options.add_argument("--headless")  
chrome_options.binary_location = '/Applications/Google Chrome   Canary.app/Contents/MacOS/Google Chrome Canary'`    

driver = webdriver.Chrome(executable_path=os.path.abspath(“chromedriver"),   chrome_options=chrome_options)  
driver.get("http://www.duo.com")` 

However when I inspect the possible arguments for the Selenium WebDriver using the command chromedriver -h this is what I get:

D:\Jobs\scripts>chromedriver -h
Usage: chromedriver [OPTIONS]

Options
  --port=PORT                     port to listen on
  --adb-port=PORT                 adb server port
  --log-path=FILE                 write server log to file instead of stderr, increases log level to INFO
  --log-level=LEVEL               set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF
  --verbose                       log verbosely (equivalent to --log-level=ALL)
  --silent                        log nothing (equivalent to --log-level=OFF)
  --append-log                    append log file instead of rewriting
  --replayable                    (experimental) log verbosely and don't truncate long strings so that the log can be replayed.
  --version                       print the version number and exit
  --url-base                      base URL path prefix for commands, e.g. wd/url
  --whitelisted-ips               comma-separated whitelist of remote IP addresses which are allowed to connect to ChromeDriver

No --headless option is available.

Does the ChromeDriver obtained from the link above allow for headless browsing?

Sherbrooke answered 4/1, 2019 at 8:30 Comment(2)
Yup as far as I have tried, I could never run Google Chrome on headless mode. I just switched to firefox.Leukocyte
I am able to run in headless mode in macos too.Fatty
F
16

--headless is not argument for chromedriver but for Chrome. --headless Run chrome in headless mode, i.e., without a UI or display server dependencies. ChromeDriver is a separate executable that WebDriver uses to control Chrome and Webdriver is a a collection of language specific bindings to drive a browser.

I am able to run in headless mode with this set of options. I hope this will help:

from bs4 import BeautifulSoup, NavigableString
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import requests
import re  
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=options)  # see edit for recent code change.
browser.implicitly_wait(20)

Update 12 Aug 2019:

old : browser = webdriver.Chrome(chrome_options=options)

new : browser = webdriver.Chrome(options=options)

Fatty answered 4/1, 2019 at 9:15 Comment(4)
But the executable has no headless option... what does the line options.add_argument('--headless') do?Sherbrooke
As @ewwink sugeested this is for chrome --headless Run chrome in headless mode, i.e., without a UI or display server dependencies. ChromeDriver is a separate executable that WebDriver uses to control Chrome. Webdriver is a a collection of language specific bindings to drive a browserFatty
so let me get this straight... chromedriver.exe itself calls Chrome.exe at some point. The idea is to have it call the driver with an additional argument ?Sherbrooke
Thanks, that's working well. yeap 'chrome_options' was deprecated so must use 'options'.Kershaw
W
5

Try

options.headless=True

The following is how I set up my headless chrome

options = webdriver.ChromeOptions()
options.headless=True
options.add_argument('window-size=1920x1080')
prefs = {
"download.default_directory": r"C:\FilePath\Download",
"download.prompt_for_download": False,
"download.directory_upgrade": True}
options.add_experimental_option('prefs', prefs)
chromedriver = (r"C:\Filepath\chromedriver.exe")
Wenda answered 8/11, 2019 at 19:53 Comment(0)
W
1

--headless is not argument for chromedriver but Chrome, you can see more arguments or Command Line Switches for chrome here

Winton answered 4/1, 2019 at 9:29 Comment(0)
C
1

As many answers correctly state, headless is an option to chrome and not for chromedriver.

Besides all of that:

  • there is --headless=new since chrome 109, which will use the very same chrome. Before that chrome and headless chrome was two different built executable (both were installed by chrome installers and packages)

  • some answer recommends to use options.headless=True. Do not. See Headless is Going Away!

Cheiro answered 10/11, 2023 at 4:21 Comment(2)
So to spell it out, do you mean options.add_argument('--headless=new')?Multiform
exactly. and actually this is the answer. In general we can try pass any Chrome's argument to Chrome using chromedriver's add_argument. In practice this means, that Chrome's documentation is relevant in many cases when we want to control ChromeCheiro

© 2022 - 2024 — McMap. All rights reserved.