带有 chromedriver 的 Selenium 根据 "headless" 参数给出不同的结果

Selenium with chromedriver gives different results based on "headless" argument

我一直在玩弄 Selenium + Chromedriver,我注意到根据是否启用或禁用 headless,我得到了不同的结果。经过一番调查,我发现 "headless" 不包括 Accept-Language header.

是否可以在 header 中手动添加这个?

这就是 Google chrome 所做的。一种解决方法是使用代理并为您修改 headers。或者您可以使用 Firefox driver,因为在使用无头选项时 driver 不会发送不同的 headers。

理想情况下,使用和不使用 --headless 选项不应该对 DOM Tree getting rendered but may have a significant difference as far as the Viewport 中的元素产生任何重大影响。

例如,当 ChromeDriver/Chrome 与 --headless 选项一起初始化时,默认的 Viewport

width = 800px, height = 600px 

当 ChromeDriver/Chrome 在没有 --headless 选项的情况下初始化时,默认的 Viewport 是:

width = 1050px, height = 708px
  • 示例代码(Python 基于):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.google.com/")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q")))
    print ("Headless Chrome Initialized")
    size = driver.get_window_size()
    print("Window size: width = {}px, height = {}px".format(size["width"], size["height"]))
    driver.quit()
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.google.com/")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q")))
    print ("Chrome Initialized")
    size = driver.get_window_size()
    print("Window size: width = {}px, height = {}px".format(size["width"], size["height"]))
    
  • 控制台输出:

    Headless Chrome Initialized
    Window size: width = 800px, height = 600px
    Chrome Initialized
    Window size: width = 1050px, height = 708px
    

因此可以得出结论,使用 --headless 选项 ChromeDriver/Chrome 以减少的 Viewport 打开会话,因此识别的元素数量更少。


解决方案

在使用 ChromeDriver/Chrome 启动 浏览实例时 始终以 maximized 模式打开:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("--headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://www.google.com/")