获取页面截图
演示 Selenium 截图的 3 类 API + 1 个 Selenium 4 新功能,自动化测试排查失败现场的必备技能。
截图方式对比:
driver.save_screenshot("shot.png") → 直接存文件,最简单driver.get_screenshot_as_file(path) → 和上面一样,返回 True/Falsedriver.get_screenshot_as_base64() → 返回 base64 字符串,可嵌进 HTML 报告driver.get_screenshot_as_png() → 返回 PNG 二进制字节,用 open(wb).write() 存el.save_screenshot("logo.png") → Selenium 4 新功能,只截某个元素!⚠️ 关键限制:Selenium 默认只能截 视口(屏幕可见区域)。要截整页需用 CDP:driver.execute_cdp_cmd("Page.captureScreenshot", {"captureBeyondViewport": True})
💡 实战套路:把截图写进 except 块,测试失败自动截图 + 文件名带时间戳,CI 环境里排查失败原因一眼看到。
save_screenshot |
嵌入 HTML → get_screenshot_as_base64 |
上传 AI → get_screenshot_as_png |
只截按钮/验证码 → element.screenshot
headless Chrome + --full-page-screenshot、selenium-screenshot 库、或 JS 滚动拼接。
# ① 启动浏览器并打开截图演示页 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://autotest-505.pages.dev/browser_op_tech_sections/screenshot_tech.html") # ② 整页(视口)截图保存为文件,成功返回 True print(driver.save_screenshot("full.png")) driver.get_screenshot_as_file("full2.png") # 等价写法 # ③ 截图为 base64 字符串,适合直接嵌入 HTML 测试报告 b64 = driver.get_screenshot_as_base64() # ④ 截图为 PNG 二进制 bytes,可在内存中处理或上传到服务器 png_data = driver.get_screenshot_as_png() with open("from_bytes.png", "wb") as f: f.write(png_data) # ⑤ 只截取单个元素(Selenium 4+,id 与本演示页按钮一致) btn = driver.find_element(By.ID, "shotBtnElement") btn.screenshot("element.png") driver.quit()
| 因素 | 本地 | CI/CD 云服务器 |
| 网络 | 专线稳定 | 数据中心共享,偶发抖动 |
| CPU | 独占 | 多租户,可能被抢占 |
| 浏览器缓存 | 有 | 没有(每次全新启动) |
| 页面加载速度 | 有缓存,秒出 | 全量下载,慢 2~5 倍 |
| 并发任务 | 只跑你这一份 | 可能几十上百个同时抢资源 |
"A session has an associated session implicit wait timeout that specifies a time to wait for the implicit element location strategy"implicit=0.5s → 驱动最多等待 500ms 后必须放弃
→ 驱动在一次 findElement / findElements 调用中,最多愿意等待的总时间即为该值,不得超时。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def test_polling(d, delay):
d.implicitly_wait(2)
d.get('about:blank')
d.execute_script(f"setTimeout(()=>{{document.body.innerHTML='t'}},{delay})")
t0 = time.perf_counter()
try:
cost = (time.perf_counter() - t0) * 1000
print(f"delay={delay:4d} 耗时={cost:6.0f} 差值={cost-delay:+5.0f}")
except: print(f"delay={delay} 超时")
driver = webdriver.Chrome()
for delay in range(10, 1550, 50): # 50ms 步进,覆盖 10~1500ms
test_polling(driver, delay)
driver.quit()
最坏 = implicit × (explicit超时 / pollFreq)try: find_element ... except NoSuchElementException:| 值 | 兜底窗口 (规范定义) |
叠加成本 explicit=15s |
白等 10次不存在 |
依据类型 | 推荐 |
| 不设(=0) | 0ms | 0 秒 | 0 秒 | 规范 | 最严谨 |
| 1s | 1000ms | 30 秒 | 10 秒 | 经验+权衡 | 默认推荐 |
| 0.5s | 500ms | 15 秒 | 5 秒 | 经验+权衡 | 确认页面 <500ms |
| 2s | 2000ms | 60 秒 | 20 秒 | 代价太大 | 谨慎 |
| ≥5s | ≥5000ms | 150 秒+ | 50 秒+ | 爆炸 | ❌ 绝对避免 |