# -*- coding: utf-8 -*- ''' 脚本说明: 本脚本基于SELENIUM实现普康健康自动审核,目前已实现登录、获取指定案件数据和案件审核(包括赔付和拒付) 作者:刘弼仁 更新时间:2024-09-12 备注: 1、在PAGEOBJECT尚未拆解自动审核动作 ''' #导入模块 import re import time import json from pageobject import PageObject import os import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) from utils.logger import Logger, fetch_exception #抽取内容配置项 extractions = { '永诚审核页面': [ { 'field': '赔案号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div' }, { 'field': '报案保单号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[3]/div[2]/div' }, { 'field': '报案方式', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[3]/div[2]' }, { 'field': '复核人', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[2]/div[5]/span[2]' }, { 'field': '出险人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[1]/div/div/div/input' }, { 'field': '出险人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[2]/div/div/div/div[1]/input' }, { 'field': '出险人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[3]/div/div/div/input' }, { 'field': '出险人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[4]/div/div/div[1]/input[1]' }, { 'field': '出险人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[4]/div/div/div[1]/input[2]' }, { 'field': '出险人与主被保险人关系', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[6]/div[3]/div/div/div/div[1]/input' }, { 'field': '主被保险人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[1]/div/div/div/input' }, { 'field': '主被保险人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[2]/div/div/div/div[1]/input' }, { 'field': '主被保险人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[3]/div/div/div/input' }, { 'field': '主被保险人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[4]/div/div/div[1]/input[1]' }, { 'field': '主被保险人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[4]/div/div/div[1]/input[2]' }, { 'field': '领款人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[1]/div/div/div/input' }, { 'field': '领款人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[2]/div/div/div/div[1]/input' }, { 'field': '领款人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[3]/div/div/div/input' }, { 'field': '领款人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[4]/div/div/div[1]/input[1]' }, { 'field': '领款人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[4]/div/div/div[1]/input[2]' }, { 'field': '开户行', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[2]/div/div/div/div[1]/input' }, { 'field': '银行账户', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[1]/div/div/div/input' }, { 'field': '联系电话', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[3]/div/div/div/input' }, { 'field': '联系地址', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[4]/div/div/div/input' }, { 'field': '出险地址', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[13]/div[2]/div/div/div/div[1]/input' }, { 'table': '保单信息', 'table_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody', 'fields': [ { 'field': '保单号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[2]' }, { 'field': '保险分公司', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[6]' }, { 'field': '出险人与主被保险人关系', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[9]' }, { 'field': '保障期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[10]' } ] }, { 'field': '票据提示', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[1]/div[2]' }, { 'table': '票据信息', 'table_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody', 'fields': [ { 'field': '票据序号', 'field_xpath': '//*[@id="pane-first"]/div/div[5]/div[2]/table/tbody/tr[index]/td[2]' }, { 'field': '票据号', 'field_xpath': '//*[@id="pane-first"]/div/div[5]/div[2]/table/tbody/tr[index]/td[4]' }, { 'field': '交款人', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[6]' }, { 'field': '就诊类型', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[7]' }, { 'field': '出险原因', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[8]' }, { 'field': '医保标志', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[10]' }, { 'field': '收款人', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[11]' }, { 'field': '开具日期', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[12]' }, { 'field': '诊断疾病', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[17]' }, { 'field': '票据金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[18]' }, { 'field': '合理金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[19]' }, { 'field': '部分自费', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]' }, { 'field': '全部自费', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]' }, { 'field': '统筹金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[22]' }, { 'field': '第三方赔付金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[24]' }, { 'field': '不合理金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[23]' }, { 'field': '关联责任', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[9]' }, { 'field': '票据验真', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[25]' }, { 'field': '票据备注', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[27]' } ] }, { 'field': '理算第一行保额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody/tr[1]/td[4]' }, { 'field': '理算金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div[1]/div/div/input' }, { 'field': '公账赔付金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div[2]/div/div/input' }, { 'field': '个账赔付金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div[3]/div/div/input' }, { 'field': '审核结论', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div/div[1]/input' } ], '瑞泰审核页面': [ { 'field': '赔案号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div/div/div/div' }, { 'field': '报案保单号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[3]/div[3]/div' }, { 'field': '报案方式', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[3]/div[2]' }, { 'field': '复核人', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[2]/div[5]/span[2]' }, { 'field': '出险人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[1]/div/div/div/input' }, { 'field': '出险人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[2]/div/div/div/div[1]/input' }, { 'field': '出险人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[3]/div/div/div/input' }, { 'field': '出险人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[4]/div/div/div/div[1]/input' }, { 'field': '出险人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[5]/div[4]/div/div/div/div[2]/input' }, { 'field': '出险人与主被保险人关系', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[6]/div[3]/div/div/div/div[1]/input' }, { 'field': '主被保险人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[8]/div[1]/div/div/div/input' }, { 'field': '主被保险人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[8]/div[2]/div/div/div/div[1]/input' }, { 'field': '主被保险人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[8]/div[3]/div/div/div/input' }, { 'field': '主被保险人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[8]/div[4]/div/div/div/div[1]/input' }, { 'field': '主被保险人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[8]/div[4]/div/div/div/div[2]/input' }, { 'field': '领款人姓名', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[1]/div/div/div/input' }, { 'field': '领款人证件类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[2]/div/div/div/div[1]/input' }, { 'field': '领款人证件号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[3]/div/div/div/input' }, { 'field': '领款人证件有效期起期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[4]/div/div/div/div[1]/input' }, { 'field': '领款人证件有效期止期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[11]/div[4]/div/div/div/div[2]/input' }, { 'field': '开户行', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[2]/div[1]/div/div/div[1]/input' }, { 'field': '开户行分行', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[13]/div[2]/div/div/div/input' }, { 'field': '开户行分行所在省市', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[13]/div[1]/div/div/div/div[1]/input' }, { 'field': '银行账户', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[1]/div[1]/div/div/input' }, { 'field': '联系电话', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[3]/div/div/div/input' }, { 'field': '联系地址', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[12]/div[4]/div/div/div/input' }, { 'field': '出险日期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[2]/div/div/div/input' }, { 'field': '出险地址', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[3]/div/div/div/div[1]/input' }, { 'field': '出险类型', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[7]/div[1]/div/div/div/div[1]/input' }, { 'table': '保单信息', 'table_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody', 'fields': [ { 'field': '保单号', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[2]' }, { 'field': '保险分公司', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[6]' }, { 'field': '出险人与主被保险人关系', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[9]' }, { 'field': '保障期', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[10]' } ] }, { 'field': '票据提示', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[1]/div[2]' }, { 'table': '票据信息', 'table_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody', 'fields': [ { 'field': '票据序号', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[2]' }, { 'field': '票据号', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[4]' }, { 'field': '交款人', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[8]' }, { 'field': '就诊类型', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[9]' }, { 'field': '医保标志', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[11]' }, { 'field': '收款人', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[14]' }, { 'field': '开具日期', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[15]' }, { 'field': '诊断疾病', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[18]' }, { 'field': '票据金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[19]' }, { 'field': '合理金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]' }, { 'field': '部分自费', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]' }, { 'field': '全部自费', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[22]' }, { 'field': '统筹金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[23]' }, { 'field': '第三方赔付金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[25]' }, { 'field': '不合理金额', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[24]' }, { 'field': '关联责任', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[10]' }, { 'field': '票据验真', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[6]' }, { 'field': '票据备注', 'field_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[26]' } ] }, { 'field': '理算第一行保额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody/tr[1]/td[4]' }, { 'field': '理算金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div/div[1]/div/div/input' }, { 'field': '公账赔付金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div/div[2]/div/div/input' }, { 'field': '个账赔付金额', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/form/div/div[3]/div/div/input' }, { 'field': '审核结论', 'field_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div/div[1]/input' } ] } #动作组配置项(固化为登录、赔案查询和赔案审核) actions = { #登录运营管理平台动作组 'login': [ #在当前标签页打开普康运营管理平台链接 { 'action_type': 'open_link', 'object': 'https://boss.pukangpay.com.cn/login' }, #等待至标签页标题为普康运营管理平台 { 'action_type': 'wait_until', 'expected_condition': 'browser_tab_title_is', 'content': '普康运营管理平台' }, #点击切换邮箱验证按钮 { 'action_type': 'click', 'object_name': '切换邮箱验证按钮', 'object': '//*[@id="app"]/div/form/div[4]/button' }, #输入登录账号 { 'action_type': 'input', 'object_name': '登录账号', 'object': '//*[@id="app"]/div/form/div[2]/div/div/input' }, #点击发送邮件验证码按钮 { 'action_type': 'click', 'object_name': '发送邮件验证码按钮', 'object': '//*[@id="app"]/div/form/div[3]/div/button' }, #输入邮箱验证码,目前通过飞书邮箱获取邮件验证码,但是不能同时获取多个 { 'action_type': 'input', 'object_name': '邮件验证码', 'object': '//*[@id="app"]/div/form/div[3]/div/div/input', 'content': 'execute: FeishuMail().get_verification_code()' }, #点击登录按钮 { 'action_type': 'click', 'object_name': '登录按钮', 'object': '//*[@id="app"]/div/form/button' }, #等待至欢迎页面的面包屑为首页 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '欢迎页面的面包屑', 'object': '//*[@id="breadcrumb-container"]/span/span/span[1]/span', 'content': '首页' } ], 'cases_query': [ #点击顶部菜单-新TPA { 'action_type': 'click', 'object_name': '顶部菜单-新TPA', 'object': '//*[@id="app"]/div/div/div[2]/div/div[2]/ul/li[3]' }, #点击左侧菜单-综合查询 { 'action_type': 'click', 'object_name': '左侧菜单-综合查询', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[4]/li/div' }, #点击左侧菜单-综合查询-赔案查询 { 'action_type': 'click', 'object_name': '左侧菜单-综合查询-赔案查询', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[4]/li/ul/div[2]' }, #等待至赔案查询页面的面包屑为赔案查询 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '赔案查询页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span', 'content': '赔案查询' }, #点击更多按钮 { 'action_type': 'click', 'object_name': '更多按钮', 'object': '//*[@id="indexPage"]/div/form[2]/div/div/div/button[1][contains(@class,"success")]' }, #输入保险分公司 { 'action_type': 'input', 'object_name': '保险分公司', 'object': '//*[@id="indexPage"]/div/form[1]/div[12]/div/div/input[contains(@placeholder,"请输入保险分公司")]' }, #点击查询按钮 { 'action_type': 'click', 'object_name': '查询按钮', 'object': '//*[@id="indexPage"]/div/form[2]/div/div/div/button[2][contains(@class,"warning")]' }, #等待至查询表格行数不为0 { 'action_type': 'wait_until', 'expected_condition': 'table_rows_is_not_zero', 'object_name': '查询表格', 'object': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]' }, #点击最后分页按钮并等待至当前分页第一行唯一标识与上一分页第一行唯一标识不相同 { 'action_type': 'click', 'object_name': '最后分页按钮', 'object': '(//*[@id="indexPage"]/main/section/div/ul/li[last()])[1]', 'first_row_identifier_xpath': '//*[@id="indexPage"]/div[3]/table/tbody/tr[1]/td[2]' }, #重复执行任务至达到预期完成任务数 { 'action_type': 'repeat', 'object_name': '点击查看按钮,打开审核页面以获取数据', #行唯一标识 'row_identifier_xpath': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]/tr[index]/td[2]', 'table_xpath': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]', 'button_next_xpath': '(//*[@id="indexPage"]/main/section/div/button[1])[1]', 'actions': [ #判断当前环节,若为指定内容则跳过,否则终止后续动作 { 'action_type': 'cognize', 'cognized_condition': 'text_is', 'object_name': '当前环节', 'object': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]/tr[index]/td[7]', #满足预期条件时执行动作 'meet': 'pass', #不满足预期条件时执行动作 'otherwies': 'break' }, #点击查看按钮并并切换至新标签页 { 'action_type': 'click_and_switch', 'object_name': ['查看按钮', '赔案审核'], 'object': '//*[@id="indexPage"]/div[4]/div[2]/table/tbody/tr[index]/td[19]/div/button[1]' }, #等待至审核页面的面包屑为永诚审核页面 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '审核页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span', 'content': '永诚审核页面' }, #等待至审核页面的赔案号非空 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is_not', 'object_name': '审核页面的赔案号', 'object': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div', 'content': '' }, #点击查看影像件按钮并切换至新标签页(影像件标签页) { 'action_type': 'click_and_switch', 'object_name': ['查看影像件按钮', '影像件'], 'object': '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[1]/div[1]/button[3]' }, #等待至影像件页面中张数非指定内容 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is_not', 'object_name': '影像件页面中张数', 'object': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[3]', 'content': '影像共计 0 张' }, #重复执行点击发票影像件并抽取内容任务 { 'action_type': 'repeat', 'object_name': '点击顶部菜单-发票,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ #点击发票影像件 { 'action_type': 'click', 'object_name': '发票影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, #抽取内容 { 'action_type': 'extract', 'extractions': [ { 'field': '票据影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, #点击申请书标签 { 'action_type': 'click', 'object_name': '申请书标签', 'object': '//*[@id="tab-3"]', }, #重复执行点击申请书影像件并抽取内容任务 { 'action_type': 'repeat', 'object_name': '点击顶部菜单-申请书,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ #点击申请书影像件 { 'action_type': 'click', 'object_name': '申请书影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, #抽取内容 { 'action_type': 'extract', 'extractions': [ { 'field': '申请书影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, #点击身份证标签 { 'action_type': 'click', 'object_name': '身份证标签', 'object': '//*[@id="tab-4"]', }, #重复执行点击身份证影像件并抽取内容任务 { 'action_type': 'repeat', 'object_name': '点击顶部菜单-身份证资料,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ #点击身份证影像件 { 'action_type': 'click', 'object_name': '身份证影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, #抽取内容 { 'action_type': 'extract', 'extractions': [ { 'field': '证件影像件类型', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[2]/div[1]/div/div[1]/input' } ] } ] }, #点击银行卡折标签 { 'action_type': 'click', 'object_name': '银行卡折标签', 'object': '//*[@id="tab-5"]', }, #重复执行点击银行卡折影像件并抽取内容任务 { 'action_type': 'repeat', 'object_name': '点击顶部菜单-其它,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ #点击银行卡折影像件 { 'action_type': 'click', 'object_name': '银行卡折影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, #抽取内容 { 'action_type': 'extract', 'extractions': [ { 'field': '银行卡折影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, #点击未分类标签 { 'action_type': 'click', 'object_name': '未分类标签', 'object': '//*[@id="tab-6"]', }, #重复执行点击未分类影像件并抽取内容任务 { 'action_type': 'repeat', 'object_name': '点击顶部菜单-未分类,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ #点击未分类影像件 { 'action_type': 'click', 'object_name': '未分类影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, #抽取内容 { 'action_type': 'extract', 'extractions': [ { 'field': '未分类影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, #关闭当前标签页并切换至上一标签页 { 'action_type': 'close_and_switch', 'object_name': ['影像件', '审核页面'] }, #抽取内容 { 'action_type': 'extract' }, { 'action_type': 'close_and_switch', 'object_name': ['审核页面', '赔案查询'] }, { 'action_type': 'repeat_finish' } ], 'first_row_identifier_xpath': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]/tr[1]/td[2]' }, { 'action_type': 'finish', } ], 'cases_audit': [ #点击顶部菜单“新TPA” { 'action_type': 'click', 'object_name': '顶部菜单-新TPA', 'object': '//*[@id="app"]/div/div/div[2]/div/div[2]/ul/li[3]' }, #点击左侧菜单“理赔管理” { 'action_type': 'click', 'object_name': '左侧菜单-理赔管理', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/div' }, #点击左侧菜单“理赔审核管理” { 'action_type': 'click', 'object_name': '左侧菜单-理赔管理-赔案审核管理', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/ul/div[6]' }, #等待至赔案审核管理页面的面包屑为赔案审核管理 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '赔案审核管理页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span', 'content': '赔案审核管理' }, #等待至查询表格行数不为0 { 'action_type': 'wait_until', 'expected_condition': 'table_rows_is_not_zero', 'object_name': '查询表格', 'object': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]' }, #重复动作组 { 'action_type': 'repeat', 'object_name': '自动审核', 'droplist_more_xpaths': ['//*[@id="indexPage"]/main/section/div/span[2]/div/div[1]/input', '/html/body/div[4]/div[1]/div[1]/ul/li[5]'], 'row_xpath': '//*[@id="indexPage"]/div[3]/table/tbody/tr[index]', 'row_identifier_xpath': '//*[@id="indexPage"]/div[4]/div[2]/table/tbody/tr[1]/td[4]', 'table_xpath': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]', 'actions': [ #点击审核按钮并切换至审核页面 { 'action_type': 'click_and_switch', 'object_name': ['审核按钮', '审核页面'], 'object': '//*[@id="indexPage"]/div[5]/div[2]/table/tbody/tr[index]/td[20]/div/button', }, #等待至审核页面的面包屑为永诚审核页面 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '审核页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span' }, #等待至审核页面中赔案号加载完成 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is_loaded', 'object_name': '赔案号' }, #抽取保单信息和票据信息用于选择保单,并将不在保期内发票的不合理金额调整为与票据金额相同 { 'action_type': 'extract' }, #判断是否需要修改发票,若需要则点击修改信息按钮,遍历发票将需要修改的发票,点击修改按钮将不合理金额修改为和发票金额相同并点击确定按钮,点击保存按钮并点击确定按钮,否则跳过 { 'action_type': 'cognize', 'cognized_condition': 'auto_audit' }, { 'action_type': 'close_and_switch', 'object_name': ['审核页面', '赔案查询'] }, { 'action_type': 'repeat_finish' } ] }, { 'action_type': 'finish', } ], #适用于瑞泰(oldmutual-chnenergy.com,耆卫保险和国家能源合资),考虑审核规则中无需用到影像件相关数据,所以去掉查看影像件相关动作 'cases_audit_oldmutual_chnenergy': [ { 'action_type': 'click', 'object_name': '新TPA', 'object': '//*[@id="app"]/div/div/div[2]/div/div[2]/ul/li[3]' }, { 'action_type': 'click', 'object_name': '理赔管理', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/div' }, { 'action_type': 'click', 'object_name': '赔案审核管理', 'object': '//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/ul/div[7]' }, { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '赔案审核管理页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span', 'content': '赔案审核管理' }, { 'action_type': 'wait_until', 'expected_condition': 'table_rows_is_not_zero', 'object_name': '待审核赔案表格', 'object': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]' }, { 'action_type': 'repeat', 'object_name': '自动审核', 'droplist_more_xpaths': ['//*[@id="indexPage"]/main/section/div/span[2]/div/div', '/html/body/div[4]/div[1]/div[1]/ul/li[5]'], 'row_xpath': '//*[@id="indexPage"]/div[3]/table/tbody/tr[index]', 'row_identifier_xpath': '//*[@id="indexPage"]/div[4]/div[2]/table/tbody/tr[1]/td[4]', 'table_xpath': '(//*[@id="indexPage"]/div[3]/table/tbody)[1]', 'actions': [ #点击审核按钮并切换至审核页面 { 'action_type': 'click_and_switch', 'object_name': ['审核按钮', '审核页面'], 'object': '//*[@id="indexPage"]/div[5]/div[2]/table/tbody/tr[index]/td[20]/div/button', }, #等待至审核页面的面包屑为永诚审核页面 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is', 'object_name': '审核页面的面包屑', 'object': '//*[@id="app"]/div/div/div/div[1]/div[1]/span/span[3]/span[1]/span' }, #等待至审核页面中赔案号加载完成 { 'action_type': 'wait_until', 'expected_condition': 'element_text_is_loaded', 'object_name': '赔案号', 'object': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div/div/div/div' }, #抽取保单信息和票据信息用于选择保单,并将不在保期内发票的不合理金额调整为与票据金额相同 { 'action_type': 'extract' }, #判断是否需要修改发票,若需要则点击修改信息按钮,遍历发票将需要修改的发票,点击修改按钮将不合理金额修改为和发票金额相同并点击确定按钮,点击保存按钮并点击确定按钮,否则跳过 { 'action_type': 'cognize', 'cognized_condition': 'auto_audit' }, { 'action_type': 'close_and_switch', 'object_name': ['审核页面', '赔案查询'] }, { 'action_type': 'repeat_finish' } ] }, { 'action_type': 'finish', } ] } ''' 类说明:封装普康健康运营管理平台中相关页面和动作 ''' class PKRobot(PageObject): #登录运营管理平台 @fetch_exception def login(self, insurance): logger.info('正在登录运营管理平台') #根据保险总公司匹配登录账号 match insurance: case '中银保险有限公司': content = 'AutomationTech001' case '永诚财产保险股份有限公司': content = 'AutomationTech002' case '瑞泰人寿保险有限公司': content = 'AutomationTech003' case default: raise Exception('保险总公司未定义') #获取登录动作组配置项 loggin_actions = actions.get('login') for index, action in enumerate(loggin_actions): #在登录动作组配置项中新增登录账号 if action.get('action_type') == 'input' and action.get('object_name') == '登录账号': loggin_actions[index].update({'content': content}) assert self.translator(actions = loggin_actions) == 'success', '登录时发生异常,程序终止' logger.info('登录成功') #打开赔案查询获取赔案数据 @fetch_exception def cases_query(self, expected_tasks, insurance_branch, expected_status): #断定预期重复数数据类型为整数且大于等于1 assert isinstance(expected_tasks, int) and expected_tasks >= 1, 'expected_tasks data type must be int and greater than 0' #获取赔案查询动作组配置项 cases_query_actions = actions.get('cases_query') #遍历动作组配置项 for index, action in enumerate(cases_query_actions): if action.get('action_type') == 'input' and action.get('object_name') == '保险分公司': #在赔案查询动作组配置项中新增保险分公司 cases_query_actions[index].update({'content': insurance_branch}) if action.get('action_type') == 'repeat' and isinstance(action.get('button_next_xpath'), str) and action.get('button_next_xpath') != '': #修改预期完成任务数 cases_query_actions[index].update({'expected_tasks': expected_tasks}) for nested_index, nested_action in enumerate(cases_query_actions[index].get('actions')): #修改预期完成任务数和指定当前环节(若赔案当前环节非指定当前环节则跳过) if nested_action.get('action_type') == 'cognize' and nested_action.get('object_name') == '当前环节': cases_query_actions[index]['actions'][nested_index].update({'content': expected_status}) #根据保险分公司匹配保险总公司和审核页面 if nested_action.get('action_type') == 'extract' and nested_action.get('extractions') is None: match insurance_branch: case condition if '中银保险有限公司' in insurance_branch or '永诚财产保险股份有限公司' in insurance_branch: cases_query_actions[index]['actions'][nested_index].update({'extractions': extractions.get('永诚审核页面')}) case condition if '瑞泰人寿保险有限公司' in insurance_branch: cases_query_actions[index]['actions'][nested_index].update({'extractions': extractions.get('瑞泰审核页面')}) case default: raise Exception('保险分公司未定义') self.login(insurance = insurance) logger.info('正在打开赔案查询获取赔案数据') #使用动作解释器打开赔案查询获取赔案数据 assert self.translator(actions = cases_query_actions), '获取赔案数据时发生异常' logger.info('获取赔案数据成功') #根据保险总公司自动审核赔案 def cases_audit(self, expected_index, expected_tasks, insurance): #根据保险总公司匹配赔案审核动作组配置项 match insurance: case '瑞泰人寿保险有限公司': cases_audit_actions = actions.get('cases_audit_oldmutual_chnenergy') case default: cases_audit_actions = actions.get('cases_audit') for index, action in enumerate(cases_audit_actions): if action.get('action_type') == 'repeat': #在赔案审核动作组配置项中新增预期索引 cases_audit_actions[index].update({'expected_index': expected_index}) #在赔案审核动作组配置项中新增预期重复数 cases_audit_actions[index].update({'expected_tasks': expected_tasks}) for nested_index, nested_action in enumerate(cases_audit_actions[index].get('actions')): #在赔案审核动作组配置项中就等待动作组新增指定内容 if nested_action.get('action_type') == 'wait_until' and nested_action.get('object_name') == '审核页面的面包屑': match insurance: case '中银保险有限公司' | '永诚财产保险股份有限公司': content = '永诚审核页面' case '瑞泰人寿保险有限公司': content = '瑞泰审核' case default: raise Exception('保险总公司未定义') cases_audit_actions[index]['actions'][nested_index].update({'content': content}) #在赔案审核动作组配置项中就等待动作组新增指定内容 if nested_action.get('action_type') == 'wait_until' and nested_action.get('object_name') == '赔案号': match insurance: case '中银保险有限公司' | '永诚财产保险股份有限公司' | '瑞泰人寿保险有限公司': #审核页面中赔案号XPATH object_ = '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div' case default: raise Exception('保险总公司未定义') cases_audit_actions[index]['actions'][nested_index].update({'object': object_}) #在赔案审核动作组配置项中就点击并切换至动作组配置项新增指定内容 if nested_action.get('action_type') == 'click_and_switch' and nested_action.get('object_name') == ['查看影像件按钮', '影像件']: match insurance: case '中银保险有限公司' | '永诚财产保险股份有限公司': #查看影像件按钮XPATH object_ = '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[1]/div[1]/button[4]' case '瑞泰人寿保险有限公司': #查看影像件按钮XPATH object_ = '//*[@id="app"]/div/div/section/main/section[1]/div[1]/div[1]/div[1]/a[2]/button' case default: raise Exception('保险总公司未定义') cases_audit_actions[index]['actions'][nested_index].update({'object': object_}) #在赔案审核动作组中就抽取内容新增抽取范围 if nested_action.get('action_type') == 'extract' and nested_action.get('extractions') is None: match insurance: case '中银保险有限公司' | '永诚财产保险股份有限公司': extractions_ = extractions.get('永诚审核页面') case '瑞泰人寿保险有限公司': extractions_ = extractions.get('瑞泰审核页面') case default: raise Exception('保险总公司未定义') cases_audit_actions[index]['actions'][nested_index].update({'extractions': extractions_}) #在赔案审核动作组中就普康自动审核新增响应配置项 #后续通过可配置化 if nested_action.get('action_type') == 'cognize' and nested_action.get('cognized_condition') == 'auto_audit': match insurance: case '中银保险有限公司': cases_audit_actions[index]['actions'][nested_index].update({'insurance': insurance}) #字段:赔案号 cases_audit_actions[index]['actions'][nested_index].update({'field_case_number_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div'}) #按钮:修改信息 cases_audit_actions[index]['actions'][nested_index].update({'button_modify_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #表格:票据 cases_audit_actions[index]['actions'][nested_index].update({'table_invoices_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody'}) #字段:票据表格中票据序号(行唯一标识) cases_audit_actions[index]['actions'][nested_index].update({'field_invoice_identifier_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[4]'}) #字段:票据表格中合理金额 cases_audit_actions[index]['actions'][nested_index].update({'field_reasonable_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[19]'}) #字段:票据表格中部分自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_part_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]'}) #字段:票据表格中全部自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_all_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]'}) #按钮:票据表格中修改 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_modify_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[29]/div/button'}) #输入框:票据表格中票据部分自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_part_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]/div/div/div/input'}) #输入框:票据表格中票据全部自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_all_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]/div/div/div/input'}) #输入框:票据表格中票据不合理金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_unreasonable_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[23]/div/div/div/input'}) #输入框:票据表格中票据备注 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_remark_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[27]/div/div/textarea'}) #按钮:票据表格中确定 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_confirm_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[29]/div/button[1]'}) #按钮:保存 cases_audit_actions[index]['actions'][nested_index].update({'button_save_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button'}) #按钮:确认修改 cases_audit_actions[index]['actions'][nested_index].update({'button_confirm_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #复选框:选择保单 cases_audit_actions[index]['actions'][nested_index].update({'checkbox_select_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[1]/div/label'}) #提示:选择保单和理算成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_select': '/html/body/div[5]/p'}) #文本:约定标题 cases_audit_actions[index]['actions'][nested_index].update({'text_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[2]/div/form/div[1]'}) #按钮:关闭约定 cases_audit_actions[index]['actions'][nested_index].update({'button_close_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[3]/div/button'}) #提示:选择保单和理算成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_report': '/html/body/div[8]/p'}) #按钮:理算 cases_audit_actions[index]['actions'][nested_index].update({'button_adjust_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/button[1]'}) #字段:理算表格第一行保单保额 cases_audit_actions[index]['actions'][nested_index].update({'field_insurance_amount_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody/tr/td[4]/div'}) #表格:理算 cases_audit_actions[index]['actions'][nested_index].update({'table_adjustment_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody'}) #文本:票据交款人与出险人不一致注意标题 cases_audit_actions[index]['actions'][nested_index].update({'text_caution_xpath': '/html/body/div/div/div[1]/div/span'}) #按钮:票据交款人与出险人不一致注意关闭 cases_audit_actions[index]['actions'][nested_index].update({'button_close_caution_xpath': '/html/body/div/div/div[3]/button[1]'}) #下拉菜单:赔付时理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_pay_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[4]/div[1]/div[1]/ul/li[1]']}) #下拉菜单:拒付是理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_refuse_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[last()]/div[1]/div[1]/ul/li[2]']}) #输入框:结论原因 cases_audit_actions[index]['actions'][nested_index].update({'textarea_refuse_remark_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[2]/div/div/div/div/textarea'}) #按钮:通过 cases_audit_actions[index]['actions'][nested_index].update({'button_audit_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button'}) #文本:不在保单保障期确认弹窗标题 cases_audit_actions[index]['actions'][nested_index].update({'text_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[1]/span'}) #按钮:不在保单保障期确认弹窗标中确认 cases_audit_actions[index]['actions'][nested_index].update({'button_confrim_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[3]/button[2]'}) #文本:提示标题 cases_audit_actions[index]['actions'][nested_index].update({'text_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[1]/span'}) #按钮:关闭提示 cases_audit_actions[index]['actions'][nested_index].update({'button_close_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[3]/div/button[1]'}) #文本:发票关联影像件 cases_audit_actions[index]['actions'][nested_index].update({'text_prompt_invoices_xpath': '/html/body/div[5]/div/div[1]/div/span'}) #抽取内容 cases_audit_actions[index]['actions'][nested_index].update({'extractions': extractions_}) case '永诚财产保险股份有限公司': cases_audit_actions[index]['actions'][nested_index].update({'insurance': insurance}) #字段:赔案号 cases_audit_actions[index]['actions'][nested_index].update({'field_case_number_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div'}) #按钮:修改信息 cases_audit_actions[index]['actions'][nested_index].update({'button_modify_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #表格:票据 cases_audit_actions[index]['actions'][nested_index].update({'table_invoices_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody'}) #字段:票据表格中票据序号(行唯一标识) cases_audit_actions[index]['actions'][nested_index].update({'field_invoice_identifier_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[2]'}) #字段:票据表格中合理金额 cases_audit_actions[index]['actions'][nested_index].update({'field_reasonable_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[19]'}) #字段:票据表格中部分自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_part_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]'}) #字段:票据表格中全部自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_all_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]'}) #按钮:票据表格中修改 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_modify_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[28]/div/button'}) #输入框:票据表格中票据部分自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_part_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]/div/div/div/input'}) #输入框:票据表格中票据全部自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_all_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]/div/div/div/input'}) #输入框:票据表格中票据不合理金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_unreasonable_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[23]/div/div/div/input'}) #输入框:票据表格中票据备注 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_remark_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[27]/div/div/textarea'}) #按钮:票据表格中确定 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_confirm_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[28]/div/button[1]'}) #按钮:保存 cases_audit_actions[index]['actions'][nested_index].update({'button_save_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button'}) #按钮:确认修改 cases_audit_actions[index]['actions'][nested_index].update({'button_confirm_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #复选框:选择保单 cases_audit_actions[index]['actions'][nested_index].update({'checkbox_select_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[1]/div/label'}) #提示:选择保单和理算成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_select': '/html/body/div[5]/p'}) #文本:约定标题 cases_audit_actions[index]['actions'][nested_index].update({'text_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[2]/div/form/div[1]'}) #按钮:关闭约定 cases_audit_actions[index]['actions'][nested_index].update({'button_close_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[3]/div/button'}) #按钮:报案 cases_audit_actions[index]['actions'][nested_index].update({'button_report_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/button[3]'}) #按钮:确定报案 cases_audit_actions[index]['actions'][nested_index].update({'button_report_confirm_xpath': '//*[@id="app"]/div/div/section/main/section[14]/div/div/div[3]/div/button[1]'}) #提示:选择保单和理算成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_report': '/html/body/div[8]/p'}) #按钮:理算 cases_audit_actions[index]['actions'][nested_index].update({'button_adjust_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/button[1]'}) #字段:理算表格第一行保单保额 cases_audit_actions[index]['actions'][nested_index].update({'field_insurance_amount_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody/tr/td[4]/div'}) #表格:理算 cases_audit_actions[index]['actions'][nested_index].update({'table_adjustment_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody'}) #文本:票据交款人与出险人不一致注意标题 cases_audit_actions[index]['actions'][nested_index].update({'text_caution_xpath': '/html/body/div/div/div[1]/div/span'}) #按钮:票据交款人与出险人不一致注意关闭 cases_audit_actions[index]['actions'][nested_index].update({'button_close_caution_xpath': '/html/body/div/div/div[3]/button[1]'}) #下拉菜单:赔付时理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_pay_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[4]/div[1]/div[1]/ul/li[1]']}) #下拉菜单:拒付是理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_refuse_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[last()]/div[1]/div[1]/ul/li[2]']}) #输入框:结论原因 cases_audit_actions[index]['actions'][nested_index].update({'textarea_refuse_remark_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[2]/div/div/div/div/textarea'}) #按钮:通过 cases_audit_actions[index]['actions'][nested_index].update({'button_audit_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button[2]'}) #文本:不在保单保障期确认弹窗标题 cases_audit_actions[index]['actions'][nested_index].update({'text_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[1]/span'}) #按钮:不在保单保障期确认弹窗标中确认 cases_audit_actions[index]['actions'][nested_index].update({'button_confrim_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[3]/button[2]'}) #文本:提示标题 cases_audit_actions[index]['actions'][nested_index].update({'text_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[1]/span'}) #按钮:关闭提示 cases_audit_actions[index]['actions'][nested_index].update({'button_close_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[3]/div/button[1]'}) #提示:审核成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_audit': '/html/body/div[6]/p'}) #抽取内容 cases_audit_actions[index]['actions'][nested_index].update({'extractions': extractions_}) case '瑞泰人寿保险有限公司': cases_audit_actions[index]['actions'][nested_index].update({'insurance': insurance}) #表格:保单 cases_audit_actions[index]['actions'][nested_index].update({'table_slips_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody'}) #字段:赔案号 cases_audit_actions[index]['actions'][nested_index].update({'field_case_number_xpath': '//*[@id="app"]/div/div/section/main/section[1]/form/div[4]/div[1]/div/div/div'}) #按钮:修改信息 cases_audit_actions[index]['actions'][nested_index].update({'button_modify_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #选择:修改原因 cases_audit_actions[index]['actions'][nested_index].update({'droplist_modify_xpath': ['//*[@id="app"]/div/div/section/main/section[5]/div/div/div[2]/div/form/div[1]/div/div/div/input', '/html/body/div[5]/div[1]/div/div[1]/ul/li[1]', '/html/body/div[5]/div[1]/div[2]/div[1]/ul/li[1]']}) #输入框:修改原因 cases_audit_actions[index]['actions'][nested_index].update({'textarea_modify_xpath': '//*[@id="app"]/div/div/section/main/section[5]/div/div/div[2]/div/form/div[2]/div/div/textarea'}) #按钮:确定修改 cases_audit_actions[index]['actions'][nested_index].update({'button_modification_confirm_xpath': '//*[@id="app"]/div/div/section/main/section[5]/div/div/div[3]/div/button[1]'}) #表格:票据 cases_audit_actions[index]['actions'][nested_index].update({'table_invoices_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody'}) #字段:票据表格中票据序号(行唯一标识) cases_audit_actions[index]['actions'][nested_index].update({'field_invoice_identifier_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[2]'}) #字段:票据表格中合理金额 cases_audit_actions[index]['actions'][nested_index].update({'field_reasonable_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[20]'}) #字段:票据表格中部分自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_part_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]'}) #字段:票据表格中全部自付金额 cases_audit_actions[index]['actions'][nested_index].update({'field_all_self_amounts_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[22]'}) #按钮:票据表格中修改 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_modify_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[30]/div/button'}) #输入框:票据表格中票据部分自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_part_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[21]/div/div/div/input'}) #输入框:票据表格中票据全部自费金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_all_self_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[22]/div/div/div/input'}) #输入框:票据表格中票据不合理金额 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_unreasonable_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[24]/div/div/div/input'}) #输入框:票据表格中票据备注 cases_audit_actions[index]['actions'][nested_index].update({'input_invoice_remark_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[26]/div/div/textarea'}) #按钮:票据表格中确定 cases_audit_actions[index]['actions'][nested_index].update({'button_invoice_confirm_xpath': '//*[@id="pane-first"]/div/div[3]/table/tbody/tr[index]/td[30]/div/button[1]'}) #按钮:保存 cases_audit_actions[index]['actions'][nested_index].update({'button_save_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button'}) #按钮:确认修改 cases_audit_actions[index]['actions'][nested_index].update({'button_confirm_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[2]/button'}) #复选框:选择保单 cases_audit_actions[index]['actions'][nested_index].update({'checkbox_select_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[4]/div[3]/table/tbody/tr[index]/td[1]/div/label'}) #提示:选择保单和理算成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_select': '/html/body/div[5]/p'}) #文本:约定标题 cases_audit_actions[index]['actions'][nested_index].update({'text_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[2]/div/form/div[1]'}) #按钮:关闭约定 cases_audit_actions[index]['actions'][nested_index].update({'button_close_stipulation_xpath': '//*[@id="specialTemplate"]/div/div/div[3]/div/button'}) #按钮:理算 cases_audit_actions[index]['actions'][nested_index].update({'button_adjust_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/button[1]'}) #字段:理算表格第一行保单保额 #cases_audit_actions[index]['actions'][nested_index].update({'field_insurance_amount_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody/tr/td[4]/div'}) #表格:理算 cases_audit_actions[index]['actions'][nested_index].update({'table_adjustment_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[6]/div[3]/div[3]/table/tbody'}) #文本:票据交款人与出险人不一致注意标题 cases_audit_actions[index]['actions'][nested_index].update({'text_caution_xpath': '/html/body/div/div/div[1]/div/span'}) #按钮:票据交款人与出险人不一致注意关闭 cases_audit_actions[index]['actions'][nested_index].update({'button_close_caution_xpath': '/html/body/div/div/div[3]/button[1]'}) #下拉菜单:赔付时理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_pay_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[4]/div[1]/div[1]/ul/li[1]']}) #下拉菜单:拒付是理赔结论 cases_audit_actions[index]['actions'][nested_index].update({'droplist_refuse_xpaths': ['//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[1]/div/div/div/div', '/html/body/div[last()]/div[1]/div[1]/ul/li[2]']}) #输入框:结论原因 cases_audit_actions[index]['actions'][nested_index].update({'textarea_refuse_remark_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/form/div[2]/div/div/div/div/textarea'}) #按钮:通过 cases_audit_actions[index]['actions'][nested_index].update({'button_audit_xpath': '//*[@id="app"]/div/div/section/main/section[1]/div[5]/div[8]/p/span[1]/button[2]'}) #文本:不在保单保障期确认弹窗标题 cases_audit_actions[index]['actions'][nested_index].update({'text_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[1]/span'}) #按钮:不在保单保障期确认弹窗标中确认 cases_audit_actions[index]['actions'][nested_index].update({'button_confrim_without_assurance_xpath': '//*[@id="app"]/div/div/section/main/div[1]/div/div[3]/button[2]'}) #文本:提示标题 cases_audit_actions[index]['actions'][nested_index].update({'text_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[1]/span'}) #按钮:关闭提示 cases_audit_actions[index]['actions'][nested_index].update({'button_close_prompt_xpath': '//*[@id="errorMessage"]/div/div/div[3]/div/button[1]'}) #提示:审核成功提示 cases_audit_actions[index]['actions'][nested_index].update({'toast_audit': '/html/body/div[6]/p'}) #抽取内容 cases_audit_actions[index]['actions'][nested_index].update({'extractions': extractions_}) case default: raise Exception('保险总公司未定义') self.login(insurance = insurance) logger.info('正在打开赔案审核管理审核') #使用动作解释器打开赔案审核管理审核 assert self.translator(actions = cases_audit_actions), '自动审核时发生异常' logger.info('自动审核成功') ''' 程序说明:启动普康健康机器人 ''' if __name__ == '__main__': #创建日志记录器 logger = Logger(logger_name = 'audit_robot').get_logger() try: #创建普康健康机器人 robot = PKRobot() match input('请选择作业类型(1获取中银保赔案数据,2自动审核中银保赔案,3获取永诚赔案数据,4自动审核永诚赔案,6自动审核瑞泰赔案):'): #获取中银保赔案数据 case '1': match input('请选择保险分公司(1中银保险有限公司广州分公司):'): case '1': expected_insurance_branch = '中银保险有限公司广州分公司' case default: logger.info('所输入保险分公司未定义,脚本终止') expected_tasks = int(input('请输入预期完成任务数:')) robot.cases_query(expected_tasks = expected_tasks, expected_insurance_branch = expected_insurance_branch, expected_status = '推送') #自动审核中银保赔案 case '2': expected_index = int(input('请输入预期索引:')) robot.cases_audit(expected_index = expected_index, expected_tasks = 200, insurance = '中银保险有限公司') #获取永诚赔案数据 case '3': match input('请选择保险分公司(1永诚财产保险股份有限公司黑龙江分公司):'): case '1': expected_insurance_branch = '永诚财产保险股份有限公司黑龙江分公司' case default: logger.info('所输入保险分公司未定义,脚本终止') expected_tasks = int(input('请输入预期完成任务数:')) robot.cases_query(expected_tasks = expected_tasks, expected_insurance_branch = expected_insurance_branch, expected_status = '推送') #自动审核永诚赔案 case '4': expected_index = int(input('请输入预期索引:')) robot.cases_audit(expected_index = expected_index, expected_tasks = 200, insurance = '永诚财产保险股份有限公司') #自动审核瑞泰赔案 case '6': expected_index = int(input('请输入预期索引:')) robot.cases_audit(expected_index = expected_index, expected_tasks = 200, insurance = '瑞泰人寿保险有限公司') case default: logger.info('所输入作业类型未定义,脚本终止') except Exception as e: print(e) logger.info('发生异常,脚本终止') ''' #点击查看影像件按钮并切换至影像件 { 'action_type': 'click_and_switch', 'object_name': ['查看影像件按钮', '影像件'] }, { 'action_type': 'wait_until', 'expected_condition': 'element_text_is_not', 'object_name': '影像件页面中张数', 'object': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[3]', 'content': '影像共计 0 张' }, { 'action_type': 'repeat', 'object_name': '点击顶部菜单-发票,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ { 'action_type': 'click', 'object_name': '发票影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]' }, { 'action_type': 'extract', 'extractions': [ { 'field': '票据影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, { 'action_type': 'click', 'object_name': '申请书标签', 'object': '//*[@id="tab-3"]', }, { 'action_type': 'repeat', 'object_name': '点击顶部菜单-申请书,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ { 'action_type': 'click', 'object_name': '申请书影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, { 'action_type': 'extract', 'extractions': [ { 'field': '申请书影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, { 'action_type': 'click', 'object_name': '身份证资料标签', 'object': '//*[@id="tab-4"]', }, { 'action_type': 'repeat', 'object_name': '点击顶部菜单-身份证资料,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ { 'action_type': 'click', 'object_name': '身份证影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, { 'action_type': 'extract', 'extractions': [ { 'field': '证件影像件类型', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[2]/div[1]/div/div[1]/input' } ] } ] }, { 'action_type': 'click', 'object_name': '未分类标签', 'object': '//*[@id="tab-6"]', }, { 'action_type': 'repeat', 'object_name': '点击顶部菜单-未分类,显示每一张影像件以获取数据', 'table_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]', 'row_identifier_xpath': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', 'actions': [ { 'action_type': 'click', 'object_name': '未分类影像件', 'object': '//*[@id="app"]/div/div/section/div/div[3]/div[3]/div[2]/div[index]', }, { 'action_type': 'extract', 'extractions': [ { 'field': '未分类影像件序号', 'field_xpath': '//*[@id="app"]/div/div/section/div/div[1]/div[1]/span[4]' } ] } ] }, { 'action_type': 'close_and_switch', 'object_name': ['影像件', '审核页面'] }, '''