无法从Excel单元格提取图片至测试,遇JpegImageFile无len()错误求助
问题描述
需要将Excel单元格中的图片提取为测试附件,避免硬编码路径,直接从工作表获取。当前提取G7单元格图片的代码如下:
def getImageAttachment(): ExcelBook = openpyxl.load_workbook("F:\MSL Automation Framework\msl.test\TestDataExcel.xlsx") sheet = ExcelBook.active image_loader = SheetImageLoader(sheet) image = image_loader.get('G7') test_ImageAttachment = [{sheet['G6'].value: image}] return test_ImageAttachment
运行测试时抛出错误:TypeError: object of type 'JpegImageFile' has no len()
解决方案
错误原因是测试框架无法直接处理SheetImageLoader.get()返回的PIL JpegImageFile对象,框架期望接收字节流或文件路径这类可计算长度的对象,因此需要转换格式。
方法1:转换为字节流(推荐,无临时文件)
将PIL图片对象转为字节流后传递给框架,代码修改如下:
from io import BytesIO from openpyxl import load_workbook from openpyxl_image_loader import SheetImageLoader def getImageAttachment(): # 使用原始字符串避免路径转义问题 ExcelBook = load_workbook(r"F:\MSL Automation Framework\msl.test\TestDataExcel.xlsx") sheet = ExcelBook.active image_loader = SheetImageLoader(sheet) image = image_loader.get('G7') # 将图片转为JPEG格式字节流 img_byte_stream = BytesIO() image.save(img_byte_stream, format='JPEG') img_byte_stream.seek(0) # 重置流指针到起始位置 test_ImageAttachment = [{sheet['G6'].value: img_byte_stream}] return test_ImageAttachment
方法2:保存为临时文件
如果框架仅支持文件路径,可创建临时文件存储图片,代码如下:
import tempfile from openpyxl import load_workbook from openpyxl_image_loader import SheetImageLoader def getImageAttachment(): ExcelBook = load_workbook(r"F:\MSL Automation Framework\msl.test\TestDataExcel.xlsx") sheet = ExcelBook.active image_loader = SheetImageLoader(sheet) image = image_loader.get('G7') # 创建临时JPG文件,程序退出时自动删除 with tempfile.NamedTemporaryFile(suffix='.jpg', delete=True) as tmp_file: image.save(tmp_file, format='JPEG') tmp_file_path = tmp_file.name test_ImageAttachment = [{sheet['G6'].value: tmp_file_path}] return test_ImageAttachment
注意:若需要在测试结束后保留文件,可将delete=True改为delete=False,但需手动清理临时文件。
内容的提问来源于stack exchange,提问作者deepak thakur
相关产品推荐
相关产品推荐

