理想情况下,使用和不使用--headless
选项不应对其中的元素产生任何重大影响DOM Tree https://javascript.info/dom-nodes得到渲染,但可能有显着差异Viewport https://www.w3schools.com/css/css_rwd_viewport.asp被关注到。
例如,当 ChromeDriver/Chrome 与--headless
选项默认Viewport is
width = 800px, height = 600px
当 ChromeDriver/Chrome 初始化时没有--headless
选项默认Viewport is:
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因此识别出的元素数量较少。
Solution
使用 ChromeDriver/Chrome 启动浏览实例始终打开于maximized
mode:
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/")