- 添加项目配置文件和环境变量设置 - 创建测试用例目录结构和命名规范 - 实现基础测试 fixture 和页面对象模型 - 添加示例测试用例和数据生成器 - 配置 playwright 和 gitignore 文件
		
			
				
	
	
		
			182 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { expect, type Locator, type Page } from '@playwright/test';
 | ||
| import { waitSpecifyApiLoad } from '@/utils/utils.js';
 | ||
| 
 | ||
| type subReportPage = {
 | ||
|     name: string;
 | ||
|     url: string[];
 | ||
| };
 | ||
| 
 | ||
| export type reportData = {
 | ||
|     name: string;
 | ||
|     value?: number;
 | ||
|     lastValue?: number;
 | ||
|     index?: number;
 | ||
|     content?: reportDataInfo[];
 | ||
| };
 | ||
| 
 | ||
| export type reportDataInfo = {
 | ||
|     name: string;
 | ||
|     value: number;
 | ||
|     lastValue: number;
 | ||
|     index: number;
 | ||
| };
 | ||
| 
 | ||
| export class ReportPage {
 | ||
|     page: Page;
 | ||
|     private subPages: subReportPage[] = [
 | ||
|         { name: '业绩汇总表', url: ['/21'] },
 | ||
|         { name: '业绩明细表', url: ['/5'] },
 | ||
|         { name: '项目销耗存表', url: ['/22'] },
 | ||
|         { name: '销售消耗汇总表', url: ['/23'] },
 | ||
|         { name: '顾客消费分析表', url: ['/24'] },
 | ||
|         { name: '储值卡卡金变动表', url: ['/6'] },
 | ||
|         { name: '开支汇总表', url: ['/7'] },
 | ||
|         { name: '顾客分诊明细表', url: ['/101'] },
 | ||
|     ];
 | ||
|     private $closeCustomReportPage: Locator;
 | ||
|     private $closeRecommendReportPage: Locator;
 | ||
| 
 | ||
|     /**
 | ||
|      * 报表模块
 | ||
|      */
 | ||
|     constructor(page: Page) {
 | ||
|         this.page = page;
 | ||
|         this.$closeCustomReportPage = this.page
 | ||
|             .locator('div')
 | ||
|             .filter({ hasText: /^自定义报表$/ })
 | ||
|             .locator('svg');
 | ||
|         this.$closeRecommendReportPage = this.page
 | ||
|             .locator('div')
 | ||
|             .filter({ hasText: /^推荐报表$/ })
 | ||
|             .locator('svg');
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @param subPageName 报表名称
 | ||
|      * - 业绩汇总表
 | ||
|      * - 业绩明细表
 | ||
|      * - 项目销耗存表
 | ||
|      * - 销售消耗汇总表
 | ||
|      * - 顾客消费分析表
 | ||
|      * - 储值卡卡金变动表
 | ||
|      * - 开支汇总表
 | ||
|      * - 顾客分诊明细表
 | ||
|      */
 | ||
|     gotoSubPage = async (subPageName: string) => {
 | ||
|         const subPage = this.subPages.find(e => e.name === subPageName);
 | ||
|         if (!subPage) {
 | ||
|             throw new Error(`子页面 ${subPageName} 不存在`);
 | ||
|         }
 | ||
|         await Promise.all([
 | ||
|             this.page.locator('.m-report_recommend .item').filter({ hasText: subPage.name }).click(),
 | ||
|             waitSpecifyApiLoad(this.page, subPage.url),
 | ||
|         ]);
 | ||
|         await expect(this.page.locator('span').filter({ hasText: '推荐报表' })).toBeVisible();
 | ||
|     };
 | ||
| 
 | ||
|     /**
 | ||
|      * 关闭自定义表格
 | ||
|      */
 | ||
|     closeCustomReportPage = async () => {
 | ||
|         await this.$closeCustomReportPage.click();
 | ||
|     };
 | ||
| 
 | ||
|     /**
 | ||
|      * 关闭推荐表格
 | ||
|      */
 | ||
|     closeRecommendReportPage = async () => {
 | ||
|         await this.$closeRecommendReportPage.click();
 | ||
|     };
 | ||
| 
 | ||
|     /**
 | ||
|      * 对比报表历史数据
 | ||
|      * @param mainClassName 主类名称
 | ||
|      * @param secondaryClassName 次类名称
 | ||
|      * @param reportData 报表数据
 | ||
|      * @param expected 期望值
 | ||
|      */
 | ||
|     toBeReportDataAsExpected = (
 | ||
|         mainClassName: string,
 | ||
|         secondaryClassName: string,
 | ||
|         reportData: reportData[],
 | ||
|         expected: number,
 | ||
|     ) => {
 | ||
|         const mainClass = reportData.find(e => e.name === mainClassName);
 | ||
| 
 | ||
|         if (!mainClass) {
 | ||
|             throw new Error('mainClass值不对');
 | ||
|         }
 | ||
| 
 | ||
|         if (
 | ||
|             secondaryClassName === '' ||
 | ||
|             (mainClass?.content?.length === 0 && typeof mainClass.content === 'undefined')
 | ||
|         ) {
 | ||
|             if (mainClass.value === undefined || mainClass.lastValue === undefined) {
 | ||
|                 throw new Error(`mainClass:${mainClassName} 的值或 lastValue 未定义`);
 | ||
|             }
 | ||
|             expect.soft(mainClass.value - mainClass.lastValue).toBe(expected);
 | ||
|         } else {
 | ||
|             if (!mainClass.content) {
 | ||
|                 throw new Error(`mainClass:${mainClass.content}`);
 | ||
|             }
 | ||
|             const secondaryClass = mainClass.content.find(e => e.name === secondaryClassName);
 | ||
| 
 | ||
|             if (!secondaryClass) {
 | ||
|                 throw new Error(`secondaryClass:${secondaryClassName}`);
 | ||
|             }
 | ||
| 
 | ||
|             expect.soft(secondaryClass.value! - secondaryClass.lastValue!).toBe(expected);
 | ||
|         }
 | ||
|     };
 | ||
| 
 | ||
|     /**
 | ||
|      * 打开自定义报表页面
 | ||
|      * @param subReportPageName
 | ||
|      * - 业绩汇总表
 | ||
|      * - 业绩明细表
 | ||
|      * - 项目销耗存表
 | ||
|      * - 销售消耗汇总表
 | ||
|      * - 顾客消费分析表
 | ||
|      * - 存储卡卡金变动表
 | ||
|      * - 开支汇总表
 | ||
|      * - 顾客分诊明细表
 | ||
|      */
 | ||
|     openCustomReportPage = async (subReportPageName: string) => {
 | ||
|         const subReportPage = this.subPages.find(e => e.name === subReportPageName);
 | ||
|         if (!subReportPage) {
 | ||
|             throw new Error(`子页面 ${subReportPageName} 不存在`);
 | ||
|         }
 | ||
| 
 | ||
|         await this.page
 | ||
|             .locator('.m-report_recommend .item')
 | ||
|             .filter({ hasText: `${subReportPageName}` })
 | ||
|             .locator('.opreate')
 | ||
|             .click();
 | ||
|     };
 | ||
| 
 | ||
|     /**
 | ||
|      * 删除自定义报表
 | ||
|      * @param reportName 自定义报表名称
 | ||
|      */
 | ||
|     deleteCustomReportPage = async (reportName: string) => {
 | ||
|         await this.page
 | ||
|             .locator('.m-report_custorm .item')
 | ||
|             .filter({ has: this.page.getByText(reportName) })
 | ||
|             .locator('.arrow')
 | ||
|             .click(); // 点击箭头
 | ||
|         await this.page.getByRole('menuitem', { name: '删除' }).click(); // 点击删除
 | ||
|         await this.page.getByRole('button', { name: /确\s认/ }).click(); // 点击确认
 | ||
|     };
 | ||
| 
 | ||
|     deleteAllCustomReportPage = async () => {
 | ||
|         const $$item = this.page.locator('.m-report_custorm .item');
 | ||
|         const itemsCount = await this.page.locator('.m-report_custorm .item').count(); // 获取所有符合条件的元素
 | ||
| 
 | ||
|         for (let i = 0; i < itemsCount; i++) {
 | ||
|             await $$item.first().locator('.arrow').click(); // 点击箭头
 | ||
|             await this.page.getByRole('menuitem', { name: '删除' }).click(); // 点击删除
 | ||
|             await this.page.getByRole('button', { name: /确\s认/ }).click(); // 点击确认
 | ||
|         }
 | ||
|     };
 | ||
| }
 |