前言
最近在项目测试中遇到了一个测试问题,特此记录一下处理步骤。
一、背景需求
身份识别项目需要每个人的身份证照片,且会自动读取识别身份证号信息进行比对,故需要生成不同的身份证信息图片,并保存,量大概是1万张左右。故需要通过自动化的方式来生成!
二、处理步骤
1.准备工作
-
可以找前端同学帮助或者自己写一个身份证的html页面,在页面可以通过ID找到身份证号的元素
-
提前准备好身份证信息的txt文本文件,一行一个身份证号
2.安装依赖库
pip install selenium
pip install PIL
这些库的功能可以自行百度了解
3.引用
from selenium import webdriver
from PIL import Image
4.代码处理逻辑
4.1 读取txt获取身份证号
# txt_path:txt文件路径
# driver_path: Chrome驱动路径
# html_path: 身份证html页面地址
# picture: 图片路径
def read_idcard(txt_path,driver_path,html_path,picture_path):
f = open(txt_path)
l = f.readline()
while l:
current_l = l.split()
id_num = current_l[0]
print(id_num)
picture_name = id_num
save_idcard(id_num,driver_path,html_path,picture_path,picture_name)
l = f.readline()
f.close()
4.2 打开html页面找到元素修改身份证号并保存
def save_idcard(photo_name,driver_path,html_path,picture_path,picture_name):
driver = webdriver.Chrome(driver_path)
driver.maximize_window()
# 打开html页面
driver.get(html_path)
#执行js语句
js='document.getElementById("cardno").innerText="%s"'%photo_name
driver.execute_script(js)
# 先保存一张全量图片
test_path = picture_path +'/test.png'
print('test_path: ',test_path)
driver.save_screenshot(test_path)
# 定位元素获取身份证信息所在的区域
pictuer = driver.find_element_by_xpath('//*[@id="sfzzm"]')
left = pictuer.location['x']
top = pictuer.location['y']
elementWidth = pictuer.location['x'] + pictuer.size['width']
elementHeight = pictuer.location['y'] + pictuer.size['height']
# 打开全量图片并截取特定位置
photo = Image.open(test_path)
photo = photo.crop((left, top, elementWidth, elementHeight))
save_path = picture_path +"\%s.png"%picture_name
photo.save(save_path)
driver.quit()
if __name__ == '__main__':
print(r'*** 修改身份证号小工具V1.1 ***')
print('\n')
txt_path = input(r"请输入身份证的txt路径: ")
driver_path = input(r"请输入Chrome的驱动路径: ")
html_path = input(r"请输入html页面的路径: ")
picture_path = input(r"请输入保存图片的文件夹路径: ")
read_idcard(txt_path, driver_path, html_path, picture_path)
总结
该方法的缺点是需要打开页面去操作,处理速度较慢。可以更换处理逻辑,先打开浏览器驱动,加载html页面,然后在读取txt文本,在调用循环,在循环中加入修改ID并保存的操作,效率提升很多!