方案二:使用 CDP(Chrome DevTools Protocol)来获取完整页面截图:

python

def take_full_screenshot(driver, filename):
    try:
        # 首先最大化窗口
        driver.maximize_window()
        time.sleep(1)

        # 尝试使用不同的缩放方法
        try:
            driver.execute_script("document.body.style.zoom='80%'")
        except:
            try:
                driver.execute_script("document.body.style.transform='scale(0.8)'; document.body.style.transformOrigin='top left'")
            except:
                try:
                    driver.execute_cdp_cmd('Emulation.setPageScaleFactor', {'pageScaleFactor': 0.8})
                except:
                    print("设置缩放比例失败,使用默认比例")

        # 使用CDP获取完整页面截图
        def get_full_page_screenshot():
            metrics = driver.execute_cdp_cmd('Page.getLayoutMetrics', {})
            width = math.ceil(metrics['contentSize']['width'])
            height = math.ceil(metrics['contentSize']['height'])
            
            # 设置设备尺寸和视口
            driver.execute_cdp_cmd('Emulation.setDeviceMetricsOverride', {
                'mobile': False,
                'width': width,
                'height': height,
                'deviceScaleFactor': 1,
            })
            
            # 捕获截图
            screenshot = driver.execute_cdp_cmd('Page.captureScreenshot', {
                'format': 'png',
                'captureBeyondViewport': True
            })
            
            # 禁用设备仿真
            driver.execute_cdp_cmd('Emulation.clearDeviceMetricsOverride', {})
            
            return screenshot
        
        # 获取截图并保存
        screenshot = get_full_page_screenshot()
        with open(filename, 'wb') as f:
            f.write(base64.b64decode(screenshot['data']))
            
        print(f"完整页面截图已保存: {filename}")
        
        # 恢复原始缩放比例
        try:
            driver.execute_script("document.body.style.zoom='100%'")
        except:
            try:
                driver.execute_script("document.body.style.transform='scale(1)'; document.body.style.transformOrigin='top left'")
            except:
                try:
                    driver.execute_cdp_cmd('Emulation.setPageScaleFactor', {'pageScaleFactor': 1.0})
                except:
                    print("恢复缩放比例失败")
                    
    except Exception as e:
        print(f"截图保存失败: {e}")

如果使用方案二,需要在文件开头添加导入:

python

import math
import base64

这两种方案的主要区别:

  1. 方案一通过模拟滚动来确保加载所有内容,然后进行截图

  2. 方案二使用 Chrome DevTools Protocol 直接获取完整页面的截图

建议先尝试方案二,因为它更直接且效率更高。如果遇到问题,再切换到方案一。方案二的优点是:

  • 执行速度更快

  • 不需要实际滚动页面

  • 能够捕获超出视口的内容

  • 图片质量更好

两种方案都包含了之前的缩放功能,所以不会影响到缩放效果。