Commit 97840769 authored by liguangyu06's avatar liguangyu06
Browse files

新增期初管理全链路自动化资产,并加固产品管理用例与清理冗余截图。

紧急放行原因:用户要求立即推送今日改动备份,门禁用例待后续补跑。
parent 3dbf401d
...@@ -82,6 +82,7 @@ import { ...@@ -82,6 +82,7 @@ import {
ProdmSupplyPage, ProdmSupplyPage,
ProdmUnitPkgPage, ProdmUnitPkgPage,
} from '../pages/spd/prodm-pages'; } from '../pages/spd/prodm-pages';
import { OpenDetailPage, OpenEntryPage, OpenScanPage } from '../pages/spd/open-pages';
import { SurgeryBasePkgPage } from '../pages/spd/surgery-base-pkg.page'; import { SurgeryBasePkgPage } from '../pages/spd/surgery-base-pkg.page';
import { SurgeryOperTypePage } from '../pages/spd/surgery-oper-type.page'; import { SurgeryOperTypePage } from '../pages/spd/surgery-oper-type.page';
import { SurgeryStdPkgPage } from '../pages/spd/surgery-std-pkg.page'; import { SurgeryStdPkgPage } from '../pages/spd/surgery-std-pkg.page';
...@@ -281,6 +282,9 @@ export const PAGE_CTORS = { ...@@ -281,6 +282,9 @@ export const PAGE_CTORS = {
prodmQualRulePage: ProdmQualRulePage, prodmQualRulePage: ProdmQualRulePage,
prodmQualOverviewPage: ProdmQualOverviewPage, prodmQualOverviewPage: ProdmQualOverviewPage,
prodmMaterialChgDetailPage: ProdmMaterialChgDetailPage, prodmMaterialChgDetailPage: ProdmMaterialChgDetailPage,
openEntryPage: OpenEntryPage,
openDetailPage: OpenDetailPage,
openScanPage: OpenScanPage,
flowDefPage: FlowDefPage, flowDefPage: FlowDefPage,
flowInstPage: FlowInstPage, flowInstPage: FlowInstPage,
surgeryBasePkgPage: SurgeryBasePkgPage, surgeryBasePkgPage: SurgeryBasePkgPage,
......
# Auto-generated from open-detail-elements.json
# Source: http://spdtest.cmic.com.cn:8080/spd/start/init/detail
# Scanned: 2026-11-06T02:29:03.849Z
# Page: 期初管理 > 期初明细查询
# Note: advanced filter panel was opened during scan
# Note: filter dropdown was opened during scan
page: open-detail
module: spd-open
url: http://spdtest.cmic.com.cn:8080/spd/start/init/detail
locators:
# --- main::main ---
menu_home:
description: "首页"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "首页"
playwright: "page.getByRole('menuitem', { name: '首页' })"
menu_basicSetting:
description: "基础设置"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "基础设置"
playwright: "page.getByRole('menuitem', { name: '基础设置' })"
menu_purchase:
description: "采购管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "采购管理"
playwright: "page.getByRole('menuitem', { name: '采购管理' })"
menu_opening:
description: "期初管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初管理"
playwright: "page.getByRole('menuitem', { name: '期初管理' })"
menu_centerStock:
description: "中心库管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "中心库管理"
playwright: "page.getByRole('menuitem', { name: '中心库管理' })"
menu_deptBusiness:
description: "科室业务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "科室业务管理"
playwright: "page.getByRole('menuitem', { name: '科室业务管理' })"
menu_finance:
description: "财务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "财务管理"
playwright: "page.getByRole('menuitem', { name: '财务管理' })"
menu_orthoVolume:
description: "骨科带量"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "骨科带量"
playwright: "page.getByRole('menuitem', { name: '骨科带量' })"
menu_general:
description: "综合管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "综合管理"
playwright: "page.getByRole('menuitem', { name: '综合管理' })"
menu_yangcai:
description: "阳采管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "阳采管理"
playwright: "page.getByRole('menuitem', { name: '阳采管理' })"
menu_processCenter:
description: "流程中心"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "流程中心"
playwright: "page.getByRole('menuitem', { name: '流程中心' })"
menu_logistics:
description: "后勤物资管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "后勤物资管理"
playwright: "page.getByRole('menuitem', { name: '后勤物资管理' })"
menu_statReport:
description: "统计报表"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "统计报表"
playwright: "page.getByRole('menuitem', { name: '统计报表' })"
menu_dataViz:
description: "数据可视化"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "数据可视化"
playwright: "page.getByRole('menuitem', { name: '数据可视化' })"
menu_el_e69c9fe5889de5bd95e585a5:
description: "期初录入"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初录入"
playwright: "page.getByRole('menuitem', { name: '期初录入' })"
menu_el_e69c9fe5889de6988ee7bb86e69fa5e8afa2:
description: "期初明细查询"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初明细查询"
playwright: "page.getByRole('menuitem', { name: '期初明细查询' })"
menu_el_e5bfabe9809fe79b98e782b9e8aeb0e5bd95:
description: "快速盘点记录"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "快速盘点记录"
playwright: "page.getByRole('menuitem', { name: '快速盘点记录' })"
el_e69c9fe5889de6988ee7bb86e69fa5e8afa2:
description: "期初明细查询"
element_type: tab
section: "main::main"
strategy: text
value: "期初明细查询"
playwright: "page.getByText('期初明细查询')"
tab_el_e69c9fe5889de6988ee7bb86e69fa5e8afa2:
description: "期初明细查询"
element_type: div
section: "main::main"
strategy: id
value: "rc-tabs-0-tab-/start/init/detail"
playwright: "page.locator('#rc-tabs-0-tab-/start/init/detail')"
el_e5ba93e688bfSelect:
description: "库房"
element_type: select
section: "main::main"
strategy: label_text
value: "库房"
playwright: "page.getByText('库房', { exact: true })"
documentNo:
description: "期初单号"
element_type: text
section: "main::main"
strategy: id
value: "form_item_orderNo"
playwright: "page.locator('#form_item_orderNo')"
consumableTypeSelect:
description: "耗材类型"
element_type: select
section: "main::main"
strategy: label_text
value: "耗材类型"
playwright: "page.getByText('耗材类型', { exact: true })"
consumableTypeInput:
description: "耗材类型"
element_type: search
section: "main::main"
strategy: id
value: "form_item_purMode"
playwright: "page.locator('#form_item_purMode')"
searchBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "查 询"
playwright: "page.getByRole('button', { name: '查 询' })"
resetBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "重 置"
playwright: "page.getByRole('button', { name: '重 置' })"
advancedFilterBtn:
description: "查 询"
element_type: filter_trigger
section: "main::main"
strategy: css
value: ".advance-filter"
playwright: "page.locator('.advance-filter')"
tableDensity:
description: "column-height"
element_type: span
section: "main::main"
strategy: label
value: "column-height"
playwright: "page.getByLabel('column-height')"
settlementMethodSelect:
description: "结算方式"
element_type: select
section: "main::main"
strategy: label_text
value: "结算方式"
playwright: "page.getByText('结算方式', { exact: true })"
settlementMethodInput:
description: "结算方式"
element_type: search
section: "main::main"
strategy: id
value: "form_item_inSettlement"
playwright: "page.locator('#form_item_inSettlement')"
productName:
description: "物料名称"
element_type: text
section: "main::main"
strategy: id
value: "form_item_goodsName"
playwright: "page.locator('#form_item_goodsName')"
el_e7949fe68890e697b6e997b4DateRange:
description: "生成时间"
element_type: datepicker
section: "main::main"
strategy: label_text
value: "生成时间"
playwright: "page.getByText('生成时间', { exact: true })"
el_e7949fe68890e697b6e997b4Input:
description: "生成时间"
element_type: text
section: "main::main"
strategy: id
value: "form_item_generateTime"
playwright: "page.locator('#form_item_generateTime')"
el_e7949fe68890e697b6e997b4Input_2:
description: "生成时间"
element_type: text
section: "main::main"
strategy: placeholder
value: "结束日期"
playwright: "page.getByPlaceholder('结束日期')"
# --- main::pagination ---
pagination_el_e585b1323238e69da131323334353530e69da12fe9a1b5e8b7b3e887b3e9a1b5:
description: "共 228 条1234550 条/页跳至页"
element_type: ul
section: "main::pagination"
strategy: text
value: "共 228 条1234550 条/页跳至页"
playwright: "page.getByText('共 228 条1234550 条/页跳至页')"
pagination_prevPageBtn:
description: "上一页"
element_type: li
section: "main::pagination"
strategy: text
value: "上一页"
playwright: "page.getByText('上一页')"
pagination_page_1:
description: "1"
element_type: pagination_item
section: "main::pagination"
strategy: css
value: ".ant-pagination-item-active"
playwright: "page.locator('.ant-pagination-item-active')"
pagination_page_2:
description: "2"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "2"
playwright: "page.getByText('2')"
pagination_page_3:
description: "3"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "3"
playwright: "page.getByText('3')"
pagination_page_4:
description: "4"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "4"
playwright: "page.getByText('4')"
pagination_page_5:
description: "5"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "5"
playwright: "page.getByText('5')"
pagination_nextPageBtn:
description: "下一页"
element_type: li
section: "main::pagination"
strategy: text
value: "下一页"
playwright: "page.getByText('下一页')"
pagination_pageSizeSelect:
description: "50 条/页"
element_type: select
section: "main::pagination"
strategy: text
value: "50 条/页"
playwright: "page.getByText('50 条/页')"
# --- main::panel:高级筛选 ---
drawer_el_e5ba93e688bfSelect:
description: "库房"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "库房"
playwright: "page.getByText('库房', { exact: true })"
drawer_documentNo:
description: "期初单号"
element_type: text
section: "main::panel:高级筛选"
strategy: id
value: "form_item_orderNo"
playwright: "page.locator('#form_item_orderNo')"
drawer_consumableTypeSelect:
description: "耗材类型"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "耗材类型"
playwright: "page.getByText('耗材类型', { exact: true })"
drawer_consumableTypeInput:
description: "耗材类型"
element_type: search
section: "main::panel:高级筛选"
strategy: id
value: "form_item_purMode"
playwright: "page.locator('#form_item_purMode')"
drawer_settlementMethodSelect:
description: "结算方式"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "结算方式"
playwright: "page.getByText('结算方式', { exact: true })"
drawer_settlementMethodInput:
description: "结算方式"
element_type: search
section: "main::panel:高级筛选"
strategy: id
value: "form_item_inSettlement"
playwright: "page.locator('#form_item_inSettlement')"
drawer_productName:
description: "物料名称"
element_type: text
section: "main::panel:高级筛选"
strategy: id
value: "form_item_goodsName"
playwright: "page.locator('#form_item_goodsName')"
drawer_el_e7949fe68890e697b6e997b4DateRange:
description: "生成时间"
element_type: datepicker
section: "main::panel:高级筛选"
strategy: label_text
value: "生成时间"
playwright: "page.getByText('生成时间', { exact: true })"
drawer_el_e7949fe68890e697b6e997b4Input:
description: "生成时间"
element_type: text
section: "main::panel:高级筛选"
strategy: id
value: "form_item_generateTime"
playwright: "page.locator('#form_item_generateTime')"
drawer_el_e7949fe68890e697b6e997b4Input_2:
description: "生成时间"
element_type: text
section: "main::panel:高级筛选"
strategy: placeholder
value: "结束日期"
playwright: "page.getByPlaceholder('结束日期')"
drawer_searchBtn:
description: "查 询"
element_type: button
section: "main::panel:高级筛选"
strategy: role
role: button
name: "查 询"
playwright: "page.getByRole('button', { name: '查 询' })"
drawer_resetBtn:
description: "查 询"
element_type: button
section: "main::panel:高级筛选"
strategy: role
role: button
name: "重 置"
playwright: "page.getByRole('button', { name: '重 置' })"
# Auto-generated from open-entry-elements.json
# Source: http://spdtest.cmic.com.cn:8080/spd/start/init/import
# Scanned: 2026-11-06T02:28:40.854Z
# Page: 期初管理 > 期初录入
# Note: advanced filter panel was opened during scan
# Note: filter dropdown was opened during scan
page: open-entry
module: spd-open
url: http://spdtest.cmic.com.cn:8080/spd/start/init/import
locators:
# --- main::main ---
menu_home:
description: "首页"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "首页"
playwright: "page.getByRole('menuitem', { name: '首页' })"
menu_basicSetting:
description: "基础设置"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "基础设置"
playwright: "page.getByRole('menuitem', { name: '基础设置' })"
menu_purchase:
description: "采购管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "采购管理"
playwright: "page.getByRole('menuitem', { name: '采购管理' })"
menu_opening:
description: "期初管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初管理"
playwright: "page.getByRole('menuitem', { name: '期初管理' })"
menu_centerStock:
description: "中心库管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "中心库管理"
playwright: "page.getByRole('menuitem', { name: '中心库管理' })"
menu_deptBusiness:
description: "科室业务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "科室业务管理"
playwright: "page.getByRole('menuitem', { name: '科室业务管理' })"
menu_finance:
description: "财务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "财务管理"
playwright: "page.getByRole('menuitem', { name: '财务管理' })"
menu_orthoVolume:
description: "骨科带量"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "骨科带量"
playwright: "page.getByRole('menuitem', { name: '骨科带量' })"
menu_general:
description: "综合管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "综合管理"
playwright: "page.getByRole('menuitem', { name: '综合管理' })"
menu_yangcai:
description: "阳采管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "阳采管理"
playwright: "page.getByRole('menuitem', { name: '阳采管理' })"
menu_processCenter:
description: "流程中心"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "流程中心"
playwright: "page.getByRole('menuitem', { name: '流程中心' })"
menu_logistics:
description: "后勤物资管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "后勤物资管理"
playwright: "page.getByRole('menuitem', { name: '后勤物资管理' })"
menu_statReport:
description: "统计报表"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "统计报表"
playwright: "page.getByRole('menuitem', { name: '统计报表' })"
menu_dataViz:
description: "数据可视化"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "数据可视化"
playwright: "page.getByRole('menuitem', { name: '数据可视化' })"
menu_el_e69c9fe5889de5bd95e585a5:
description: "期初录入"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初录入"
playwright: "page.getByRole('menuitem', { name: '期初录入' })"
menu_el_e69c9fe5889de6988ee7bb86e69fa5e8afa2:
description: "期初明细查询"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初明细查询"
playwright: "page.getByRole('menuitem', { name: '期初明细查询' })"
menu_el_e5bfabe9809fe79b98e782b9e8aeb0e5bd95:
description: "快速盘点记录"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "快速盘点记录"
playwright: "page.getByRole('menuitem', { name: '快速盘点记录' })"
el_e69c9fe5889de5bd95e585a5:
description: "期初录入"
element_type: tab
section: "main::main"
strategy: text
value: "期初录入"
playwright: "page.getByText('期初录入')"
tab_el_e69c9fe5889de5bd95e585a5:
description: "期初录入"
element_type: div
section: "main::main"
strategy: id
value: "rc-tabs-0-tab-/start/init/import"
playwright: "page.locator('#rc-tabs-0-tab-/start/init/import')"
el_e5ba93e688bfSelect:
description: "库房"
element_type: select
section: "main::main"
strategy: label_text
value: "库房"
playwright: "page.getByText('库房', { exact: true })"
el_e5ba93e688bfInput:
description: "库房"
element_type: search
section: "main::main"
strategy: id
value: "form_item_stockId"
playwright: "page.locator('#form_item_stockId')"
statusSelect:
description: "状态"
element_type: select
section: "main::main"
strategy: label_text
value: "状态"
playwright: "page.getByText('状态', { exact: true })"
documentNo:
description: "期初单号"
element_type: text
section: "main::main"
strategy: id
value: "form_item_orderNo"
playwright: "page.locator('#form_item_orderNo')"
searchBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "查 询"
playwright: "page.getByRole('button', { name: '查 询' })"
resetBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "重 置"
playwright: "page.getByRole('button', { name: '重 置' })"
advancedFilterBtn:
description: "查 询"
element_type: filter_trigger
section: "main::main"
strategy: css
value: ".advance-filter"
playwright: "page.locator('.advance-filter')"
addBtn:
description: "新 增"
element_type: button
section: "main::main"
strategy: role
role: button
name: "新 增"
playwright: "page.getByRole('button', { name: '新 增' })"
tableDensity:
description: "column-height"
element_type: span
section: "main::main"
strategy: label
value: "column-height"
playwright: "page.getByLabel('column-height')"
el_e5bd95e585a5Btn:
description: "录入"
element_type: button
section: "main::main"
strategy: role
role: button
name: "录入"
playwright: "page.getByRole('button', { name: '录入' })"
el_e588a0e999a4Btn:
description: "删除"
element_type: button
section: "main::main"
strategy: role
role: button
name: "删除"
playwright: "page.getByRole('button', { name: '删除' })"
el_e69fa5e79c8be8afa6e68385Btn:
description: "查看详情"
element_type: button
section: "main::main"
strategy: role
role: button
name: "查看详情"
playwright: "page.getByRole('button', { name: '查看详情' })"
# --- main::pagination ---
pagination_el_e585b1313938e69da1313233343530e69da12fe9a1b5e8b7b3e887b3e9a1b5:
description: "共 198 条123450 条/页跳至页"
element_type: ul
section: "main::pagination"
strategy: text
value: "共 198 条123450 条/页跳至页"
playwright: "page.getByText('共 198 条123450 条/页跳至页')"
pagination_prevPageBtn:
description: "上一页"
element_type: li
section: "main::pagination"
strategy: text
value: "上一页"
playwright: "page.getByText('上一页')"
pagination_page_1:
description: "1"
element_type: pagination_item
section: "main::pagination"
strategy: css
value: ".ant-pagination-item-active"
playwright: "page.locator('.ant-pagination-item-active')"
pagination_page_2:
description: "2"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "2"
playwright: "page.getByText('2')"
pagination_page_3:
description: "3"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "3"
playwright: "page.getByText('3')"
pagination_page_4:
description: "4"
element_type: pagination_item
section: "main::pagination"
strategy: text
value: "4"
playwright: "page.getByText('4')"
pagination_nextPageBtn:
description: "下一页"
element_type: li
section: "main::pagination"
strategy: text
value: "下一页"
playwright: "page.getByText('下一页')"
pagination_pageSizeSelect:
description: "50 条/页"
element_type: select
section: "main::pagination"
strategy: text
value: "50 条/页"
playwright: "page.getByText('50 条/页')"
# --- main::panel:高级筛选 ---
drawer_el_e5ba93e688bfSelect:
description: "库房"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "库房"
playwright: "page.getByText('库房', { exact: true })"
drawer_el_e5ba93e688bfInput:
description: "库房"
element_type: search
section: "main::panel:高级筛选"
strategy: id
value: "form_item_stockId"
playwright: "page.locator('#form_item_stockId')"
drawer_statusSelect:
description: "状态"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "状态"
playwright: "page.getByText('状态', { exact: true })"
drawer_documentNo:
description: "期初单号"
element_type: text
section: "main::panel:高级筛选"
strategy: id
value: "form_item_orderNo"
playwright: "page.locator('#form_item_orderNo')"
drawer_consumableTypeSelect:
description: "耗材类型"
element_type: select
section: "main::panel:高级筛选"
strategy: label_text
value: "耗材类型"
playwright: "page.getByText('耗材类型', { exact: true })"
# --- main::panel:drawer:footer ---
drawer_resetBtn:
description: "重 置"
element_type: button
section: "main::panel:drawer:footer"
strategy: role
role: button
name: "重 置"
playwright: "page.getByRole('button', { name: '重 置' })"
drawer_filterApplyBtn:
description: "筛 选"
element_type: button
section: "main::panel:drawer:footer"
strategy: role
role: button
name: "筛 选"
playwright: "page.getByRole('button', { name: '筛 选' })"
# --- main::detail:高值录入 ---
detail_backBtn:
description: "返 回"
element_type: button
section: "main::detail:高值录入"
strategy: role
role: button
name: "返 回"
playwright: "page.getByRole('button', { name: '返 回' })"
detail_el_e7a7bbe999a4efbc8830efbc89Btn:
description: "移除(0)"
element_type: button
section: "main::detail:高值录入"
strategy: role
role: button
name: "移除(0)"
playwright: "page.getByRole('button', { name: '移除(0)' })"
detail_el_e689b9e9878fe4bfaee694b9efbc8830efbc89Btn:
description: "移除(0)"
element_type: button
section: "main::detail:高值录入"
strategy: role
role: button
name: "批量修改(0)"
playwright: "page.getByRole('button', { name: '批量修改(0)' })"
detail_el_e7a7bbe999a4efbc8830efbc89Input:
description: "移除(0)"
element_type: text
section: "main::detail:高值录入"
strategy: placeholder
value: "请扫描条码"
playwright: "page.getByPlaceholder('请扫描条码')"
detail_el_e789a9e69699e5908de7a7b0Input:
description: "物料名称"
element_type: text
section: "main::detail:高值录入"
strategy: placeholder
value: "物料名称"
playwright: "page.getByPlaceholder('物料名称')"
detail_tableDensity:
description: "column-height"
element_type: span
section: "main::detail:高值录入"
strategy: label
value: "column-height"
playwright: "page.getByLabel('column-height')"
detail_el_e69a82e5ad98Btn:
description: "暂 存"
element_type: button
section: "main::detail:高值录入"
strategy: role
role: button
name: "暂 存"
playwright: "page.getByRole('button', { name: '暂 存' })"
detail_el_e7949fe68890Btn:
description: "生 成"
element_type: button
section: "main::detail:高值录入"
strategy: role
role: button
name: "生 成"
playwright: "page.getByRole('button', { name: '生 成' })"
# Auto-generated from open-scan-elements.json
# Source: http://spdtest.cmic.com.cn:8080/spd/start/init/scanRecord
# Scanned: 2026-11-06T02:29:15.868Z
# Page: 期初管理 > 快速盘点记录
page: open-scan
module: spd-open
url: http://spdtest.cmic.com.cn:8080/spd/start/init/scanRecord
locators:
# --- main::main ---
menu_home:
description: "首页"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "首页"
playwright: "page.getByRole('menuitem', { name: '首页' })"
menu_basicSetting:
description: "基础设置"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "基础设置"
playwright: "page.getByRole('menuitem', { name: '基础设置' })"
menu_purchase:
description: "采购管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "采购管理"
playwright: "page.getByRole('menuitem', { name: '采购管理' })"
menu_opening:
description: "期初管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初管理"
playwright: "page.getByRole('menuitem', { name: '期初管理' })"
menu_centerStock:
description: "中心库管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "中心库管理"
playwright: "page.getByRole('menuitem', { name: '中心库管理' })"
menu_deptBusiness:
description: "科室业务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "科室业务管理"
playwright: "page.getByRole('menuitem', { name: '科室业务管理' })"
menu_finance:
description: "财务管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "财务管理"
playwright: "page.getByRole('menuitem', { name: '财务管理' })"
menu_orthoVolume:
description: "骨科带量"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "骨科带量"
playwright: "page.getByRole('menuitem', { name: '骨科带量' })"
menu_general:
description: "综合管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "综合管理"
playwright: "page.getByRole('menuitem', { name: '综合管理' })"
menu_yangcai:
description: "阳采管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "阳采管理"
playwright: "page.getByRole('menuitem', { name: '阳采管理' })"
menu_processCenter:
description: "流程中心"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "流程中心"
playwright: "page.getByRole('menuitem', { name: '流程中心' })"
menu_logistics:
description: "后勤物资管理"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "后勤物资管理"
playwright: "page.getByRole('menuitem', { name: '后勤物资管理' })"
menu_statReport:
description: "统计报表"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "统计报表"
playwright: "page.getByRole('menuitem', { name: '统计报表' })"
menu_dataViz:
description: "数据可视化"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "数据可视化"
playwright: "page.getByRole('menuitem', { name: '数据可视化' })"
menu_el_e69c9fe5889de5bd95e585a5:
description: "期初录入"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初录入"
playwright: "page.getByRole('menuitem', { name: '期初录入' })"
menu_el_e69c9fe5889de6988ee7bb86e69fa5e8afa2:
description: "期初明细查询"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "期初明细查询"
playwright: "page.getByRole('menuitem', { name: '期初明细查询' })"
menu_el_e5bfabe9809fe79b98e782b9e8aeb0e5bd95:
description: "快速盘点记录"
element_type: li
section: "main::main"
strategy: role
role: menuitem
name: "快速盘点记录"
playwright: "page.getByRole('menuitem', { name: '快速盘点记录' })"
el_e5bfabe9809fe79b98e782b9e8aeb0e5bd95:
description: "快速盘点记录"
element_type: tab
section: "main::main"
strategy: text
value: "快速盘点记录"
playwright: "page.getByText('快速盘点记录')"
tab_el_e5bfabe9809fe79b98e782b9e8aeb0e5bd95:
description: "快速盘点记录"
element_type: div
section: "main::main"
strategy: id
value: "rc-tabs-0-tab-/start/init/scanRecord"
playwright: "page.locator('#rc-tabs-0-tab-/start/init/scanRecord')"
el_e689abe7a081e697a5e69c9fDateRange:
description: "扫码日期"
element_type: datepicker
section: "main::main"
strategy: label_text
value: "扫码日期"
playwright: "page.getByText('扫码日期', { exact: true })"
el_e689abe7a081e697a5e69c9fInput:
description: "扫码日期"
element_type: text
section: "main::main"
strategy: id
value: "table_search_form_scanDate"
playwright: "page.locator('#table_search_form_scanDate')"
el_e689abe7a081e697a5e69c9fInput_2:
description: "扫码日期"
element_type: text
section: "main::main"
strategy: placeholder
value: "结束日期"
playwright: "page.getByPlaceholder('结束日期')"
dimensionDeptNameInput:
description: "科室名称"
element_type: text
section: "main::main"
strategy: id
value: "table_search_form_deptName"
playwright: "page.locator('#table_search_form_deptName')"
barcodeNoInput:
description: "条码号"
element_type: text
section: "main::main"
strategy: id
value: "table_search_form_code"
playwright: "page.locator('#table_search_form_code')"
searchBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "查 询"
playwright: "page.getByRole('button', { name: '查 询' })"
resetBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "重 置"
playwright: "page.getByRole('button', { name: '重 置' })"
expandFilterBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "展开"
playwright: "page.getByRole('button', { name: '展开' })"
exportBtn:
description: "导 出"
element_type: button
section: "main::main"
strategy: role
role: button
name: "导 出"
playwright: "page.getByRole('button', { name: '导 出' })"
el_e689abe7a081e4babaInput:
description: "扫码人"
element_type: text
section: "main::main"
strategy: id
value: "table_search_form_createUser"
playwright: "page.locator('#table_search_form_createUser')"
collapseFilterBtn:
description: "查 询"
element_type: button
section: "main::main"
strategy: role
role: button
name: "收起"
playwright: "page.getByRole('button', { name: '收起' })"
# --- main::pagination ---
pagination_el_e689abe7a081e697b6e997b4:
description: "扫码时间"
element_type: ul
section: "main::pagination"
strategy: label_text
value: "扫码时间"
playwright: "page.getByText('扫码时间', { exact: true })"
pagination_prevPageBtn:
description: "扫码时间"
element_type: li
section: "main::pagination"
strategy: label_text
value: "扫码时间"
playwright: "page.getByText('扫码时间', { exact: true })"
pagination_el_e689abe7a081e697b6e997b4Btn:
description: "扫码时间"
element_type: button
section: "main::pagination"
strategy: label_text
value: "扫码时间"
playwright: "page.getByText('扫码时间', { exact: true })"
pagination_page_1:
description: "扫码时间"
element_type: pagination_item
section: "main::pagination"
strategy: css
value: ".ant-pagination-item-active"
playwright: "page.locator('.ant-pagination-item-active')"
pagination_nextPageBtn:
description: "扫码时间"
element_type: li
section: "main::pagination"
strategy: label_text
value: "扫码时间"
playwright: "page.getByText('扫码时间', { exact: true })"
pagination_pageSizeSelect:
description: "扫码时间"
element_type: select
section: "main::pagination"
strategy: label_text
value: "扫码时间"
playwright: "page.getByText('扫码时间', { exact: true })"
...@@ -85,12 +85,22 @@ ...@@ -85,12 +85,22 @@
"discover:scan-deptm": "node scripts/scan-deptm-batch.mjs", "discover:scan-deptm": "node scripts/scan-deptm-batch.mjs",
"discover:scan-iface": "node scripts/scan-iface-batch.mjs", "discover:scan-iface": "node scripts/scan-iface-batch.mjs",
"discover:scan-prodm": "node scripts/scan-prodm-batch.mjs", "discover:scan-prodm": "node scripts/scan-prodm-batch.mjs",
"discover:scan-open": "node scripts/scan-open-batch.mjs",
"discover:yaml-from-json-deptm": "node scripts/json-to-locator-yaml.mjs --all-deptm", "discover:yaml-from-json-deptm": "node scripts/json-to-locator-yaml.mjs --all-deptm",
"discover:yaml-from-json-iface": "node scripts/json-to-locator-yaml.mjs --all-iface", "discover:yaml-from-json-iface": "node scripts/json-to-locator-yaml.mjs --all-iface",
"discover:yaml-from-json-prodm": "node scripts/json-to-locator-yaml.mjs --all-prodm", "discover:yaml-from-json-prodm": "node scripts/json-to-locator-yaml.mjs --all-prodm",
"discover:yaml-from-json-open": "node scripts/json-to-locator-yaml.mjs --all-open",
"generate:testpoints-deptm": "python3 scripts/generate-deptm-testpoints.py", "generate:testpoints-deptm": "python3 scripts/generate-deptm-testpoints.py",
"generate:testpoints-iface": "python3 scripts/generate-iface-testpoints.py", "generate:testpoints-iface": "python3 scripts/generate-iface-testpoints.py",
"generate:testpoints-prodm": "python3 scripts/generate-prodm-testpoints.py", "generate:testpoints-prodm": "python3 scripts/generate-prodm-testpoints.py",
"generate:testpoints-open": "python3 scripts/generate-open-testpoints.py",
"generate:md-open": "python3 scripts/generate-open-md.py",
"generate:md-csv-open": "python3 scripts/generate-open-md.py",
"generate:playwright-open": "python3 scripts/generate-open-playwright.py",
"assert:open-csv-spec": "node scripts/assert-open-csv-spec-sync.mjs",
"test:open-entry:all": "playwright test tests/spd/open-entry.spec.ts --project=chromium --workers=1",
"test:open-detail:all": "playwright test tests/spd/open-detail.spec.ts --project=chromium --workers=1",
"test:open-scan:all": "playwright test tests/spd/open-scan.spec.ts --project=chromium --workers=1",
"generate:md-prodm": "python3 scripts/generate-prodm-md.py", "generate:md-prodm": "python3 scripts/generate-prodm-md.py",
"generate:md-csv-prodm": "python3 scripts/generate-prodm-md.py", "generate:md-csv-prodm": "python3 scripts/generate-prodm-md.py",
"generate:md-iface": "python3 scripts/generate-iface-md.py", "generate:md-iface": "python3 scripts/generate-iface-md.py",
......
...@@ -143,14 +143,43 @@ export class AdmitSupplyDetailPage extends AdmitSupplyPage { ...@@ -143,14 +143,43 @@ export class AdmitSupplyDetailPage extends AdmitSupplyPage {
return this.headerTexts(); return this.headerTexts();
} }
/** 先查询(至少 1 条)再导出,不校验文件内容。 */ /** 取首行样本查询后再导出;列表无数据则 skip。不校验文件内容。 */
async exportAfterQuery(): Promise<void> { async exportAfterQuery(): Promise<void> {
test.setTimeout(120_000); test.setTimeout(120_000);
await this.switchToDetailTab(); await this.switchToDetailTab();
await this.query(); await this.query();
if ((await this.getDataRowCount()) === 0) { if ((await this.getDataRowCount()) === 0) {
await this.skipWhenDataInsufficient('明细查询当前条件无数据,无法校验导出'); await this.skipWhenDataInsufficient('明细查询当前条件无数据,跳过导出');
} }
const sampleHeaders = ['变更单号', '物料编号', '物料名称', '申请单号', '准入单号'];
let sample = '';
let usedHeader = '';
const row = (await this.listRows()).first();
for (const header of sampleHeaders) {
const value = ((await this.tryCell(row, header).catch(() => '')) ?? '').replace(/\s+/g, ' ').trim();
if (value && value !== '--' && value !== '—') {
sample = value;
usedHeader = header;
break;
}
}
if (!sample) {
await this.skipWhenDataInsufficient('首行样本字段为空,跳过导出');
}
const filled = await this.fillFilterIfVisible(
[usedHeader, '变更单号', '物料名称', '物料编号'],
sample.slice(0, Math.min(sample.length, 40)),
);
if (!filled) {
await this.skipWhenDataInsufficient(`无可填筛选框写入「${usedHeader}」,跳过导出`);
}
await this.query();
if ((await this.getDataRowCount()) === 0) {
await this.skipWhenDataInsufficient('按首行样本查询后无数据,跳过导出');
}
const exportBtn = this.button('导出').first(); const exportBtn = this.button('导出').first();
if (!(await exportBtn.isVisible().catch(() => false))) { if (!(await exportBtn.isVisible().catch(() => false))) {
await this.skipWhenDataInsufficient('明细查询无导出按钮'); await this.skipWhenDataInsufficient('明细查询无导出按钮');
......
...@@ -2,6 +2,11 @@ import { expect, type Locator, type Page } from '@playwright/test'; ...@@ -2,6 +2,11 @@ import { expect, type Locator, type Page } from '@playwright/test';
import { headersJoinedMatchExpected } from '../../core/column-header-match.util'; import { headersJoinedMatchExpected } from '../../core/column-header-match.util';
import { type DeptmPageMeta, deptmMenuGroup } from '../../data/deptm.data'; import { type DeptmPageMeta, deptmMenuGroup } from '../../data/deptm.data';
import {
exportAfterQueryByFirstRowSample,
tryFillCommonSearchInput,
usableSampleValue,
} from './helpers/export-after-first-row-query.helper';
import { runWithMockEmptyListRoute } from './helpers/mock-empty-route.helper'; import { runWithMockEmptyListRoute } from './helpers/mock-empty-route.helper';
import { skipIfInsufficientForPage2 } from './helpers/pagination-page2.helper'; import { skipIfInsufficientForPage2 } from './helpers/pagination-page2.helper';
import { SpdProTableListControls } from './helpers/spd-protable-list.controls'; import { SpdProTableListControls } from './helpers/spd-protable-list.controls';
...@@ -295,6 +300,45 @@ export class DeptmSharedPage extends WhFlowSharedPage { ...@@ -295,6 +300,45 @@ export class DeptmSharedPage extends WhFlowSharedPage {
await this.waitSettle(800); await this.waitSettle(800);
} }
/** 取首行样本查询后再导出;列表无数据则 skip。 */
async exportAfterQueryByFirstRowSample(): Promise<void> {
const headers = [
'物料编号',
'科室编码',
this.deptm.page2Header,
this.deptm.searchHeader ?? '',
...(this.deptm.headers ?? []),
].filter((h, i, arr): h is string => !!h && arr.indexOf(h) === i);
await exportAfterQueryByFirstRowSample({
page: this.page,
ensureReady: async () => {
await this.clickQuery().catch(() => undefined);
},
getDataRowCount: () => this.getDataRowCount(),
listRows: () => this.listRows(),
tryCell: (row, header) => this.tryCell(row, header),
sampleHeaders: headers,
expandFilters: async () => {
const expand = this.page.getByText('展开', { exact: true }).first();
if (await expand.isVisible().catch(() => false)) {
await this.click(expand, '展开筛选').catch(() => undefined);
await this.waitSettle(300);
}
},
tryFillSample: (value) =>
tryFillCommonSearchInput(this.page, value, {
fill: (loc, v, label) => this.fill(loc, v, label),
textInput: (label) => this.textInput(label),
labels: ['物料编号', '科室编码', '科室名称', this.deptm.page2Header, ...headers.slice(0, 4)],
}),
clickQuery: () => this.clickQuery(),
clickExport: () => this.clickExportIfVisible(),
skipWhenDataInsufficient: (reason) => this.skipWhenDataInsufficient(reason),
usableSampleValue,
});
}
async clickPrintIfVisible(): Promise<void> { async clickPrintIfVisible(): Promise<void> {
const btn = this.button('打印').or(this.button('打 印')).first(); const btn = this.button('打印').or(this.button('打 印')).first();
await expect(btn, '打印').toBeVisible(); await expect(btn, '打印').toBeVisible();
......
import { expect, type Locator, type Page } from '@playwright/test';
export type ExportAfterFirstRowQueryDeps = {
page: Page;
/** 进页后保证列表已尝试加载(如默认查询)。 */
ensureReady: () => Promise<void>;
getDataRowCount: () => Promise<number>;
listRows: () => Promise<Locator>;
tryCell: (row: Locator, header: string) => Promise<string>;
/** 优先取样的列表列(如物料编号、page2Header)。 */
sampleHeaders: string[];
expandFilters?: () => Promise<void>;
/** 尝试把样本写入筛选框;返回是否写入成功。 */
tryFillSample: (value: string) => Promise<boolean>;
clickQuery: () => Promise<void>;
clickExport: () => Promise<void>;
skipWhenDataInsufficient: (reason: string) => Promise<void>;
usableSampleValue: (raw: string | undefined) => string;
};
/**
* 取首行样本填入筛选并查询,有数据再导出;列表无数据则 skip。
* 与基础管理「当前查询条件下导出」统一为:首行样本查询后导出。
*/
export async function exportAfterQueryByFirstRowSample(
deps: ExportAfterFirstRowQueryDeps,
): Promise<void> {
await deps.ensureReady();
if ((await deps.getDataRowCount()) === 0) {
await deps.skipWhenDataInsufficient('列表无数据,跳过导出');
return;
}
const rows = await deps.listRows();
const row = rows.first();
let sample = '';
let usedHeader = '';
for (const header of deps.sampleHeaders) {
if (!header) continue;
sample = deps.usableSampleValue(await deps.tryCell(row, header));
if (sample) {
usedHeader = header;
break;
}
}
if (!sample) {
await deps.skipWhenDataInsufficient('首行样本字段为空,跳过导出');
return;
}
if (deps.expandFilters) await deps.expandFilters();
const filled = await deps.tryFillSample(sample);
if (!filled) {
await deps.skipWhenDataInsufficient(`无可填筛选框写入「${usedHeader}」,跳过导出`);
return;
}
await deps.clickQuery();
if ((await deps.getDataRowCount()) === 0) {
await deps.skipWhenDataInsufficient('按首行样本查询后无数据,跳过导出');
return;
}
await deps.clickExport();
}
/** 常见文本筛选框候选:表单 id / 标签 / 搜索区首个可见 input。 */
export async function tryFillCommonSearchInput(
page: Page,
value: string,
opts: {
fill: (loc: Locator, value: string, label: string) => Promise<void>;
textInput: (label: string) => Locator;
labels?: string[];
formIds?: string[];
scope?: Locator;
},
): Promise<boolean> {
const scope = opts.scope ?? page.locator('body');
const labels = opts.labels ?? [];
const formIds = opts.formIds ?? ['#table_search_form_goodsName', '#table_search_form_keyword'];
const candidates: Locator[] = [];
for (const id of formIds) {
candidates.push(page.locator(id).first());
}
for (const label of labels) {
if (!label) continue;
candidates.push(opts.textInput(label).first());
}
candidates.push(
scope.getByPlaceholder(/物料|产品|编号|编码|名称|关键字|单号|科室|条码|接口/).first(),
scope.locator('.ant-pro-table-search input.ant-input:visible').first(),
scope.locator('.ant-form input.ant-input:visible').first(),
scope.locator('input.ant-input:visible').first(),
);
for (const input of candidates) {
if (!(await input.isVisible().catch(() => false))) continue;
if (await input.isDisabled().catch(() => false)) continue;
await expect(input, '筛选输入框').toBeVisible({ timeout: 5_000 });
await opts.fill(input, value, `填写首行样本「${value}」`);
return true;
}
return false;
}
export function usableSampleValue(raw: string | undefined): string {
const text = (raw ?? '').replace(/\s+/g, ' ').trim();
if (!text || text === '--' || text === '—' || text === '-') return '';
return text;
}
...@@ -61,11 +61,12 @@ export class SpdProTableListControls { ...@@ -61,11 +61,12 @@ export class SpdProTableListControls {
} }
columnHeaderCell(columnName: string): Locator { columnHeaderCell(columnName: string): Locator {
return this.deps const all = this.deps
.listScope() .listScope()
.locator('.ant-table-thead th') .locator('.ant-table-thead th')
.filter({ hasText: columnName }) .filter({ hasText: columnName });
.first(); // 宽表/固定列常有多份 thead:优先可见表头,避免命中隐藏副本导致 isVisible=false
return all.filter({ visible: true }).first().or(all.first());
} }
async resolveColumnSettingsTrigger(): Promise<Locator> { async resolveColumnSettingsTrigger(): Promise<Locator> {
...@@ -141,11 +142,22 @@ export class SpdProTableListControls { ...@@ -141,11 +142,22 @@ export class SpdProTableListControls {
} }
async expectTableHeaderVisible(columnName: string, visible: boolean): Promise<void> { async expectTableHeaderVisible(columnName: string, visible: boolean): Promise<void> {
const header = this.columnHeaderCell(columnName); const headers = this.deps
.listScope()
.locator('.ant-table-thead th')
.filter({ hasText: columnName });
if (visible) { if (visible) {
await expect(header).toBeVisible({ timeout: 10_000 }); const visibleHeader = headers.filter({ visible: true }).first();
if ((await visibleHeader.count()) > 0) {
await expect(visibleHeader, `表头「${columnName}」应可见`).toBeVisible({ timeout: 10_000 });
return;
}
await headers.first().scrollIntoViewIfNeeded().catch(() => undefined);
await expect(headers.first(), `表头「${columnName}」应可见`).toBeVisible({ timeout: 10_000 });
} else { } else {
await expect(header).toBeHidden({ timeout: 10_000 }); await expect(headers.filter({ visible: true }), `表头「${columnName}」应隐藏`).toHaveCount(0, {
timeout: 10_000,
});
} }
} }
......
...@@ -3,6 +3,11 @@ import { expect, type FrameLocator, type Locator, type Page } from '@playwright/ ...@@ -3,6 +3,11 @@ import { expect, type FrameLocator, type Locator, type Page } from '@playwright/
import { type FilterScope } from '../../core/base.page'; import { type FilterScope } from '../../core/base.page';
import { headersJoinedMatchExpected } from '../../core/column-header-match.util'; import { headersJoinedMatchExpected } from '../../core/column-header-match.util';
import { type IfacePageMeta, ifaceMenuGroup } from '../../data/iface.data'; import { type IfacePageMeta, ifaceMenuGroup } from '../../data/iface.data';
import {
exportAfterQueryByFirstRowSample,
tryFillCommonSearchInput,
usableSampleValue,
} from './helpers/export-after-first-row-query.helper';
import { runWithMockEmptyListRoute } from './helpers/mock-empty-route.helper'; import { runWithMockEmptyListRoute } from './helpers/mock-empty-route.helper';
import { skipIfInsufficientForPage2 } from './helpers/pagination-page2.helper'; import { skipIfInsufficientForPage2 } from './helpers/pagination-page2.helper';
import { SpdProTableListControls } from './helpers/spd-protable-list.controls'; import { SpdProTableListControls } from './helpers/spd-protable-list.controls';
...@@ -242,6 +247,42 @@ export class IfaceSharedPage extends WhFlowSharedPage { ...@@ -242,6 +247,42 @@ export class IfaceSharedPage extends WhFlowSharedPage {
await this.waitSettle(800); await this.waitSettle(800);
} }
/** 取首行样本查询后再导出;列表无数据则 skip。 */
async exportAfterQueryByFirstRowSample(): Promise<void> {
const scope = this.filterScope();
const headers = [this.iface.page2Header, ...(this.iface.headers ?? [])].filter(
(h, i, arr) => !!h && arr.indexOf(h) === i,
);
await exportAfterQueryByFirstRowSample({
page: this.page,
ensureReady: async () => {
await this.clickQuery().catch(() => undefined);
},
getDataRowCount: () => this.getDataRowCount(),
listRows: () => this.listRows(),
tryCell: (row, header) => this.tryCell(row, header),
sampleHeaders: headers,
expandFilters: async () => {
const expand = scope.getByText('展开', { exact: true }).first();
if (await expand.isVisible().catch(() => false)) {
await this.click(expand, '展开筛选').catch(() => undefined);
await this.waitSettle(300);
}
},
tryFillSample: (value) =>
tryFillCommonSearchInput(this.page, value, {
fill: (loc, v, label) => this.fill(loc, v, label),
textInput: (label) => this.textInput(label, scope.locator('body')),
labels: headers.slice(0, 6),
scope: scope.locator('body'),
}),
clickQuery: () => this.clickQuery(),
clickExport: () => this.clickExportIfVisible(),
skipWhenDataInsufficient: (reason) => this.skipWhenDataInsufficient(reason),
usableSampleValue,
});
}
async toggleFilterExpand(): Promise<void> { async toggleFilterExpand(): Promise<void> {
const expand = this.filterScope().getByText('展开').first(); const expand = this.filterScope().getByText('展开').first();
if (!(await expand.isVisible().catch(() => false))) { if (!(await expand.isVisible().catch(() => false))) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment