Selenium中Chrome扩展结合无头模式实现全页截图的问题
解决Chrome无头模式下加载扩展+全页截图的矛盾问题
问题描述
- 开启headless模式时,扩展无法生效;关闭headless模式时,全页截图功能异常。
- 尝试
--headless=new参数,扩展可生效但全页截图失败;尝试--headless=chrome参数时,报错:Message: unknown error: failed to wait for extension background page to load。 - 已执行滚动到底部操作,仍无法解决问题。
解决方案1:用无头新模式+DevTools协议截图(推荐)
--headless=new模式支持扩展加载,但原生save_screenshot在这种模式下可能无法正确捕获全页高度。改用Chrome DevTools协议的Page.captureScreenshot方法,这是更可靠的全页截图方案,同时兼容扩展加载。
调整后的完整代码:
import time import os import base64 from selenium import webdriver from selenium.webdriver.chrome.service import ChromeService def scroll_to_bottom(driver): prev_height = driver.execute_script("return window.scrollY") while True: driver.execute_script("window.scrollBy(0, 500);") time.sleep(0.5) new_height = driver.execute_script("return window.scrollY") if new_height == prev_height: break prev_height = new_height chrome_options = webdriver.ChromeOptions() script_path = os.path.abspath(__file__) # 用crx文件加载扩展,比直接加载本地安装目录更稳定 naver_pass_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(script_path))),'screenshot', 'jojlddfolpiejckahpinefdikdogenjg.crx') chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--disable-popup-blocking') chrome_options.add_extension(naver_pass_path) chrome_service = ChromeService() driver = webdriver.Chrome(service=chrome_service, options=chrome_options) url = 'https://m.cafe.naver.com/musiclord/1087911' driver.get(url) time.sleep(3) scroll_to_bottom(driver) # 调用DevTools协议捕获全页截图 screenshot_file = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(script_path))),'screenshot', 'take_picture', 'resource', 'screenshot.png') screenshot_data = driver.execute_cdp_cmd( "Page.captureScreenshot", {"captureBeyondViewport": True, "fromSurface": True} ) # 将base64编码的截图数据写入文件 with open(screenshot_file, "wb") as f: f.write(base64.b64decode(screenshot_data['data'])) driver.quit()
解决方案2:修复旧无头模式的扩展加载报错
如果必须用--headless=chrome模式,添加沙箱禁用参数并延长扩展加载等待时间,可解决后台页面加载失败的问题:
- 调整Chrome参数:
chrome_options.add_argument('--headless=chrome') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_extension(naver_pass_path) # 同样用crx文件加载
- 初始化驱动后延长等待时间,确保扩展加载完成:
driver = webdriver.Chrome(service=chrome_service, options=chrome_options) time.sleep(5) # 比原来的等待时间更长,给扩展足够加载时间
核心注意事项
- 加载扩展优先用
.crx文件,无头模式下直接读取本地已安装的扩展目录容易触发权限或加载顺序问题 - 全页截图优先用DevTools协议方法,比
save_screenshot更适配无头模式 - 不要混合不同无头模式的参数,保持参数一致性
内容的提问来源于stack exchange,提问作者JoBro
相关产品推荐
相关产品推荐

