You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins中Radish框架Cucumber报告失败场景无法附加截图

在Radish框架中为失败场景附加截图到Cucumber报告的解决方案

问题背景

在Jenkins流水线中使用Selenium、Python和Radish框架运行feature文件时,尝试在失败场景后将截图附加到Cucumber报告,两段代码均报错:

  1. 第一段代码因@after.each_scenario钩子无法传入step参数触发TypeError
  2. 第二段代码因引用的step是普通函数而非Radish的Step对象,触发AttributeError

错误代码及原因

第一段错误代码

@after.each_scenario
def reportgenerate(scenario, step):
    if scenario.state == "failed":
        screenshot_dir = "./results"
        screenshot_file_path = "{}/{}.png".format(screenshot_dir, scenario.id)
        driver.save_screenshot(screenshot_file_path)
        step.embed(driver.get_screenshot_as_base64(),
           mime_type='image/png',
           encode_data_to_base64=False)

报错原因:@after.each_scenario钩子仅会传入scenario参数,函数声明中额外添加的step参数无法被钩子传递,因此触发TypeError: missing 1 required positional argument: 'step'

第二段错误代码

@after.each_scenario
def reportgenerate(scenario):
    if scenario.state == "failed":
        screenshot_dir = "./results"
        screenshot_file_path = "{}/{}.png".format(screenshot_dir, scenario.id)
        driver.save_screenshot(screenshot_file_path)
        step.embed(driver.get_screenshot_as_base64(),
           mime_type='image/png',
           encode_data_to_base64=False)

报错原因:函数中引用的step并非Radish框架的Step对象,而是全局作用域中的普通函数,普通函数没有embed属性,因此触发AttributeError: 'function' object has no attribute 'embed'

正确解决方案

根据Radish官方文档翻译内容:

要在Cucumber报告中嵌入数据(如截图),需使用@after.each_step钩子,并通过Step对象的embed()方法实现。该方法接受三个参数:待嵌入的数据、MIME类型、是否自动将数据编码为base64(若传入的已是base64格式,需设为False)。

正确代码示例

import os
from radish import after

@after.each_step
def embed_screenshot_on_failure(step):
    # 检查当前步骤所属场景是否失败
    if step.scenario.state == "failed":
        # 获取base64格式截图并嵌入报告
        screenshot_base64 = driver.get_screenshot_as_base64()
        step.embed(
            screenshot_base64,
            mime_type='image/png',
            encode_data_to_base64=False
        )
        # 可选:将截图保存到本地目录
        screenshot_dir = "./results"
        # 确保目录存在
        os.makedirs(screenshot_dir, exist_ok=True)
        screenshot_file_path = f"{screenshot_dir}/{step.scenario.id}.png"
        driver.save_screenshot(screenshot_file_path)

关键说明

  • 使用@after.each_step钩子:该钩子会自动传入Radish的Step对象,具备embed()方法
  • 通过step.scenario关联到所属场景,判断场景是否失败
  • 利用Selenium的get_screenshot_as_base64()直接获取base64格式截图,无需额外编码,因此encode_data_to_base64设为False

内容的提问来源于stack exchange,提问作者Priya Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:35:23