Jenkins中Radish框架Cucumber报告失败场景无法附加截图
在Radish框架中为失败场景附加截图到Cucumber报告的解决方案
问题背景
在Jenkins流水线中使用Selenium、Python和Radish框架运行feature文件时,尝试在失败场景后将截图附加到Cucumber报告,两段代码均报错:
- 第一段代码因
@after.each_scenario钩子无法传入step参数触发TypeError - 第二段代码因引用的
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
相关产品推荐
相关产品推荐

