Как настроить ChromeDriver для запуска браузера Chrome в режиме Headless через Selenium?

Я работаю над сценарием Python для веб-скрапа и пошел по пути использования Chromedriver в качестве одного из пакетов. Я хотел бы, чтобы это работало в фоновом режиме без каких-либо всплывающих окон. Я использую опцию 'headless' на chromedriver, и она, кажется, делает свою работу с точки зрения не показа окна браузера, однако, я все еще вижу, что исполняемый файл.exe. Смотрите на скриншот того, о чем я говорю. Скриншот

Это код, который я использую для запуска ChromeDriver:

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
options.add_argument('headless')
options.add_argument('window-size=0x0')
chrome_driver_path = "C:\Python27\Scripts\chromedriver.exe"

То, что я пытался сделать, это изменить размер окна в опциях на 0x0, но я не уверен, что что-то сделал, так как файл.exe все еще выскакивал.

Есть идеи, как я могу это сделать?

Я использую Python 2.7 к вашему сведению

18 ответов

Решение

Поэтому после исправления моего кода:

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
options.add_argument('--disable-gpu')
options.add_argument('--headless')
chrome_driver_path = "C:\Python27\Scripts\chromedriver.exe"

Файл.exe все еще появлялся при запуске скрипта. Хотя это избавило меня от некоторых дополнительных выводов, говорящих мне "Не удалось запустить процесс GPU".

В итоге я запустил скрипт на Python с использованием файла.bat

В общем,

  1. Сохранить скрипт Python, если папка
  2. Откройте текстовый редактор и выведите следующий код (конечно, отредактируйте его в своем скрипте)

    c: \ python27 \ python.exe c: \ SampleFolder \ ThisIsMyScript.py% *

  3. Сохраните файл.txt и измените расширение на.bat

  4. Дважды щелкните по нему, чтобы запустить файл

Так что это только что открыл скрипт в командной строке, и ChromeDriver, кажется, работает в этом окне, не высовываясь в переднюю часть моего экрана и, таким образом, решая проблему.

Это должно выглядеть так:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')  # Last I checked this was necessary.
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

Это работает для меня, используя Python 3.6, я уверен, что это будет работать и для 2.7.

Обновление 2018-10-26: в эти дни вы можете просто сделать это:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

При работе с Selenium Client 3.11.x, ChromeDriver v2.38 и Google Chrome v65.0.3325.181 в режиме без наушников необходимо учитывать следующие моменты:

  • Вам нужно добавить аргумент --headless вызвать Chrome в режиме без головы.
  • Для систем с ОС Windows необходимо добавить аргумент --disable-gpu
  • Согласно Headless: сделать флаг --disable-gpu ненужным --disable-gpu флаг не требуется в системах Linux и MacOS.
  • Согласно SwiftShader не удается установить на Windows в режиме без головы --disable-gpu флаг станет ненужным и в системах Windows.
  • аргументация start-maximized требуется для развернутого видового экрана.
    • Вот ссылка на подробности о Viewport.
  • Вы можете потребовать добавить аргумент --no-sandbox обойти модель безопасности ОС.

  • Пример блока кода Windows:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument("--headless") # Runs Chrome in headless mode.
    options.add_argument('--no-sandbox') # Bypass OS security model
    options.add_argument('--disable-gpu')  # applicable to windows os only
    options.add_argument('start-maximized') # 
    options.add_argument('disable-infobars')
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("http://google.com/")
    print ("Headless Chrome Initialized on Windows OS")
    
  • Пример блока кода Linux:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument("--headless") # Runs Chrome in headless mode.
    options.add_argument('--no-sandbox') # # Bypass OS security model
    options.add_argument('start-maximized')
    options.add_argument('disable-infobars')
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path='/path/to/chromedriver')
    driver.get("http://google.com/")
    print ("Headless Chrome Initialized on Linux OS")
    

Обновление (23 апреля-2018)

Программный вызов браузера Google Chrome в режиме без головы стал намного проще с доступностью метода set_headless(headless=True) следующее:

  • Документация:

    set_headless(headless=True)
        Sets the headless argument
    
        Args:
            headless: boolean value indicating to set the headless option
    
  • Образец кода:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.set_headless(headless=True)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("http://google.com/")
    print ("Headless Chrome Initialized")
    driver.quit()
    

Примечание: --disable-gpu аргумент реализован внутри.


Обновление (13 октября-2018)

Чтобы вызвать браузер Chrome в режиме без головы, вы можете просто установить --headless собственность через Options() Класс следующим образом:

  • Образец кода:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("http://google.com/")
    print ("Headless Chrome Initialized")
    driver.quit()
    

Обновление 20 августа 2020 г. - Теперь все просто!

from selenium.webdriver.support.ui import WebDriverWait

chrome_options = webdriver.ChromeOptions()
chrome_options.headless = True

self.driver = webdriver.Chrome(
            executable_path=DRIVER_PATH, chrome_options=chrome_options)

ОБНОВЛЕНО В моем случае все работает нормально:

      from selenium import webdriver

options = webdriver.ChromeOptions()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, options=options)

Только что поменял в 2020 году. У меня работает нормально.

  1. В любом случае.exe будет работать. По словам Google - "Запустить в автономном режиме, т. Е. Без пользовательского интерфейса или отображения зависимостей сервера".

  2. Лучше добавить две черты к аргументам командной строки, т.е. options.add_argument('--headless')

  3. В безголовом режиме также предлагается отключить графический процессор, т.е. options.add_argument('--disable-gpu')

Попробуйте использовать ChromeDriverManager

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager 
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.set_headless()
browser =webdriver.Chrome(ChromeDriverManager().install(),chrome_options=chrome_options)
browser.get('https://google.com')
# capture the screen
browser.get_screenshot_as_file("capture.png")

Приведенные выше решения не работают с веб-сайтами с защитой от облачных вычислений, например: https://paxful.com/fr/buy-bitcoin.

Измените агент следующим образом: options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/84.0.4147.125 Safari/537.36")

Исправление найдено здесь: в чем разница в доступе к веб-сайту Cloudflare с помощью ChromeDriver/Chrome в обычном / безголовом режиме через Selenium Python

System.setProperty("webdriver.chrome.driver",
         "D:\\Lib\\chrome_driver_latest\\chromedriver_win32\\chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--allow-running-insecure-content");
chromeOptions.addArguments("--window-size=1920x1080");
chromeOptions.addArguments("--disable-gpu"); 
chromeOptions.setHeadless(true);
ChromeDriver driver = new ChromeDriver(chromeOptions);

Поскольку исполняемый путь устарел

      from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

from selenium.webdriver import ChromeOptions
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

options = ChromeOptions()
options.add_argument('--headless=new')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

Сначала я столкнулся с проблемой — пустой экран при использовании безгласного режима для Chrome с Selenium.

Я попробовал переопределить пользовательский агент, но это не помогло. И тут я увидел в документации, что для Chrome версии 109 и далее рекомендуется устанавливать безголовый режим следующим образом:

      options.addArguments("--headless=new")

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/chromium/ChromiumOptions.html#setHeadless(boolean)

Итак, полный код для запуска безголового режима:

      ChromeOptions options = new ChromeOptions()
options.addArguments("--window-size=1920,1080")
options.addArguments("--headless=new") 
options.setExperimentalOption("w3c", false) 
  
from chromedriver_py import binary_path
 
 
chrome_options = webdriver.ChromeOptions()
   chrome_options.add_argument('--headless')
   chrome_options.add_argument('--no-sandbox')
   chrome_options.add_argument('--disable-gpu')
   chrome_options.add_argument('--window-size=1280x1696')
   chrome_options.add_argument('--user-data-dir=/tmp/user-data')
   chrome_options.add_argument('--hide-scrollbars')
   chrome_options.add_argument('--enable-logging')
   chrome_options.add_argument('--log-level=0')
   chrome_options.add_argument('--v=99')
   chrome_options.add_argument('--single-process')
   chrome_options.add_argument('--data-path=/tmp/data-path')
   chrome_options.add_argument('--ignore-certificate-errors')
   chrome_options.add_argument('--homedir=/tmp')
   chrome_options.add_argument('--disk-cache-dir=/tmp/cache-dir')
   chrome_options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')
   
  driver = webdriver.Chrome(executable_path = binary_path,options=chrome_options)

Обновление августа 2021 года:

Вероятно, самый быстрый способ сделать это:

      from selenium import webdriver  

options = webdriver.ChromeOptions()
options.set_headless = True
driver = webdriver.Chrome(options=options)

options.headless = True устарел.

      from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome('/usr/bin/chromedriver', options=chrome_options)
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
chromeoptions=add_argument("--no-sandbox");
add_argument("--ignore-certificate-errors");
add_argument("--disable-dev-shm-usage'")

не поддерживаемый браузер

решение:

Open Browser    ${event_url}    ${BROWSER}   options=add_argument("--no-sandbox"); add_argument("--ignore-certificate-errors"); add_argument("--disable-dev-shm-usage'")

не забудьте добавить пробелы между ${BROWSER} параметры

Есть возможность скрыть окно chromeDriver.exe в альфа- и бета-версиях Selenium 4.

      from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService # Similar thing for firefox also!
from subprocess import CREATE_NO_WINDOW # This flag will only be available in windows
chrome_service = ChromeService('chromedriver', creationflags=CREATE_NO_WINDOW)
driver = webdriver.Chrome(service=chrome_service) # No longer console window opened, niether will chromedriver output

Вы можете проверить это здесь . Чтобы установить бета-версию или альфа-версию, вы можете выполнить команду «pip install selenium == 4.0.0.a7» или «pip install selenium == 4.0.0.b4» (a7 означает альфа-7, а b4 означает бета-4, поэтому для другие версии, которые вы хотите, вы можете изменить команду.) Чтобы импортировать определенную версию библиотеки в python, вы можете посмотреть здесь .

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ

Недавно было выполнено обновление безголового режима Chrome. Флаг--headlessтеперь изменен и может использоваться, как показано ниже

Для Chrome версии 109 и выше:--headless=newфлаг позволяет нам исследовать полную функциональность браузера Chrome в автономном режиме. Для Chrome версии 108 и ниже (до версии 96)--headless=chromeoption предоставит нам безголовый хром-браузер.

Итак, добавим

      options.add_argument("--headless=new")

для более новой версии Chrome в автономном режиме, как указано выше.

Нижеприведенное отлично работает для меня с версией Chrome110.0.5481.104

      chrome_driver_path = r"E:\driver\chromedriver.exe"
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')

//New Update
options.add_argument("--headless=new")  

options.binary_location = r"C:\Chrome\Application\chrome.exe"
browser = webdriver.Chrome(chrome_driver_path, options=options)
browser.get('https://www.google.com')

Вы можете запустить Headless Chrome с Selenium на Python, как показано ниже. *Мой ответ объясняет это примерами Django и--headless=newлучше, потому что--headlessиспользует старый безголовый режим, согласно данным «Headless is Going Away!»:

      from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless=new") # Here
driver = webdriver.Chrome(options=options)

Или:

      from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless=new") # Here
driver = webdriver.Chrome(options=options)
Другие вопросы по тегам