如何配置 ChromeDriver 以通过 Selenium 在 Headless 模式下启动 Chrome 浏览器?

How to configure ChromeDriver to initiate Chrome browser in Headless mode through Selenium?

我正在编写一个 python 脚本来进行网络抓取,并且已经沿着使用 Chromedriver 作为软件包之一的道路前进。我希望它在后台运行而不弹出任何窗口 windows。我在 chromedriver 上使用选项 'headless',它似乎在不显示浏览器 window 方面完成了工作,但是,我仍然看到 .exe 文件 运行。请参阅我正在谈论的内容的屏幕截图。 Screenshot

这是我用来启动 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"

我尝试做的是将选项中的 window 大小更改为 0x0,但我不确定这样做有什么效果,因为 .exe 文件仍然弹出。

关于如何执行此操作的任何想法?

我正在使用 Python 2.7 仅供参考

  1. .exe 无论如何都会是 运行。根据 Google - "Run in headless mode, i.e., without a UI or display server dependencies."

  2. 最好在命令行参数前加上 2 个破折号,即 options.add_argument('--headless')

  3. 在无头模式下,也建议关闭GPU,即options.add_argument('--disable-gpu')

它应该是这样的:

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, options=options)

所以在将我的代码更正为:

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 文件仍然出现。虽然这确实摆脱了一些额外的输出告诉我 "Failed to launch GPU process".

最终起作用的是 运行使用 .bat 文件Python 运行我的脚本

基本上,

  1. 如果文件夹
  2. 保存python脚本
  3. 打开文本编辑器,转储以下代码(当然要编辑到您的脚本中)

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

  4. 保存 .txt 文件并将扩展名更改为 .bat

  5. 双击运行文件

所以这只是在命令提示符中打开了脚本,而 ChromeDriver 似乎在此 window 中运行而没有弹出到我的屏幕前面,从而解决了问题。

2018 年 10 月 13 日的回答更新

通过Options()class实例发起一个 browsing context using driven now you can just set the --headless属性到true如下:

  • 有效代码块:

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

2018 年 4 月 23 日的回答更新

调用 in mode programmatically have become much easier with the availability of the method 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()
    

Note : --disable-gpu argument is implemented internally.


2018 年 3 月 30 日的原始答案

使用 Selenium Client 3.11.xChromeDriver v2.38Google Chrome v65.0.3325.181Headless 模式下你必须考虑以下几点:

  • 您需要添加参数 --headless 以在无头模式下调用 Chrome。

  • 对于Windows OS系统你需要添加参数--disable-gpu

  • 根据 Headless: make --disable-gpu flag unnecessary --disable-gpu 标志在 Linux 系统Mac 上不需要OS.

  • 根据 SwiftShader fails an assert on Windows in headless mode --disable-gpu 标志在 Windows 系统 上也将变得不必要。

  • 参数 start-maximized 是最大化 Viewport.

    所必需的
  • 这里是 link 关于 Viewport 的详细信息。

  • 您可能需要添加参数 --no-sandbox 以绕过 OS 安全模型。

  • 有效代码块:

    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")
    
  • 有效代码块:

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

逐步浏览 YouTube 视频

How to initialize Chrome Browser in Maximized Mode through Selenium

结尾


tl;博士

这是 Sandbox 故事的 link。

尝试使用 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")
  
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)

2020 年 8 月 20 日更新 -- 现在很简单!

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

self.driver = webdriver.Chrome(
            executable_path=DRIVER_PATH, chrome_options=chrome_options)
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} 选项之间添加空格

上述解决方案不适用于具有 cloudflare 保护的网站,例如:https://paxful.com/fr/buy-bitcoin

修改代理如下: options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) [=20= .0.4147.125 Safari/537.36")

在此处找到修复:

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

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

2020 年刚刚更改。对我来说很好用。

有一个选项可以在 Selenium 4 的 alpha 和 beta 版本中隐藏 chromeDriver.exe window。

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

您可以从 here. To pip install beta or alpha versions, you can do "pip install selenium==4.0.0.a7" or "pip install selenium==4.0.0.b4" (a7 means alpha-7 and b4 means beta-4 so for other versions you want, you can modify the command.) To import a specific version of a library in python you can look here 查看。

2021 年 8 月更新:

最快的方法可能是:

from selenium import webdriver  

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

options.headless = True 已弃用。