This repository has been archived on 2025-04-22. You can view files and clone it, but cannot push or open issues or pull requests.
hlk_autotest/tests/touch/boss_goal.spec.ts
2024-12-29 22:04:57 +08:00

1500 lines
72 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// @ts-check
import { expect, test } from '@/fixtures/boss_common.js';
import { staffData } from '@/common/staff';
import { Employees } from '@/common/userconfig';
import { Customer } from '@/utils/customer';
import { KeepOnlyNumbers } from '@/utils/utils.js';
test.describe('目标设置', () => {
test('总部设置', async ({ page, homeNavigation, numberInput }) => {
const goal = 100; //目标金额
const employeeA = Employees.FirstShop.Employee_3.name;
await homeNavigation.gotoModule('目标');
await page.getByRole('button', { name: '设置目标' }).click();
await page.locator('.popupComTableStyle .m-table__fixed-left tbody tr td:first-child').first().waitFor();
// 员工A内行数
const allTrA = page.locator('.popupComTableStyle .m-table__fixed-left tbody tr td:first-child');
const nowRowA = await allTrA
.allInnerTexts()
.then(text => {
return text.findIndex(item => item.includes(employeeA));
})
.then(Number);
if (nowRowA === -1) {
throw new Error('员工A不存在');
}
await page
.locator('.popupComTableStyle .m-table__body .main-table-body_tr')
.nth(nowRowA)
.locator('.m-table-cell')
.nth(1)
.click();
await numberInput.delAllValue();
await numberInput.setValue(goal);
await numberInput.confirmValue();
await page.getByRole('button', { name: /保\s存/ }).click();
await page.locator('.ant-message', { hasText: '设置成功' }).waitFor();
// 等待加载完成
await expect(page.locator('.m-table__icon__warp')).toBeHidden();
// 员工A行数
const allTrB = page.locator('.tableStyle .m-table__fixed-left tbody tr');
const nowRowB = await allTrB
.allInnerTexts()
.then(text => {
return text.findIndex(item => item.includes(employeeA));
})
.then(Number);
const verify = page
.locator('.tableStyle .m-table__body-wrapper tbody tr')
.nth(nowRowB)
.locator('.is-right .targetValue')
.nth(0);
// 对比输入的目标
await expect(verify).toContainText(`${goal}`);
// 清理
await page.getByRole('button', { name: '设置目标' }).click();
await page
.locator('.popupComTableStyle .m-table__body .main-table-body_tr')
.nth(nowRowA)
.locator('.m-table-cell')
.nth(1)
.click();
await numberInput.delAllValue();
await numberInput.confirmValue();
await page.getByRole('button', { name: /保\s存/ }).click();
});
});
test.describe('个人看板', () => {
test('查看个人看板', async ({ page, createCustomer, homeNavigation }) => {
// 今日消费之前和之后的现金和消耗
let lastCash;
let lastExpend;
// 上月和本月的现金和消耗
let lastMonthCash;
let lastMonthExpend;
// 定义会员
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
// 定位器
const verify = page.locator('.m-table__header-wrapper .date_box');
const customer = createCustomer;
await test.step('进入目标界面获取初始数据', async () => {
// 进入目标界面获取初始数据
await homeNavigation.gotoModule('目标');
await page.locator('.m-table__fixed-left .employeeName', { hasText: '张伟' }).click();
await page.locator('.m-table__body-wrapper').last().waitFor();
await expect(page.locator('.m-table__icon__warp')).toBeHidden();
lastCash = KeepOnlyNumbers(
await verify
.filter({ has: page.locator('.title', { hasText: '现金' }) })
.locator('.target_txt')
.last()
.innerText(),
);
lastExpend = KeepOnlyNumbers(
await verify
.filter({ has: page.locator('.title', { hasText: '消耗' }) })
.locator('.target_txt')
.last()
.innerText(),
);
// 点击上个月
await page.locator('.left_btn').last().click();
await expect(page.locator('.m-table__icon__warp')).toBeHidden();
lastMonthCash = KeepOnlyNumbers(
await verify
.filter({ has: page.locator('.title', { hasText: '现金' }) })
.locator('.target_txt')
.last()
.innerText(),
);
lastMonthExpend = KeepOnlyNumbers(
await verify
.filter({ has: page.locator('.title', { hasText: '消耗' }) })
.locator('.target_txt')
.last()
.innerText(),
);
// 关闭目标窗口
await page.locator('.close_icon').last().click();
});
await test.step('购买项目A并消耗(本月)', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '张伟' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: '张伟' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 选择现金结算
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('购买项目A并消耗(补录上月)', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '张伟' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: '张伟' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 点击补录
await page.locator('.recording_checkbox').click();
// 点击上个月
await page.locator('.ant-calendar-prev-month-btn').waitFor();
await page.locator('.ant-calendar-prev-month-btn').click();
// 选择上个月15号
await page.locator('.ant-calendar-cell', { hasText: '15' }).click();
await page.locator('.date_text .date', { hasText: '15' }).waitFor();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('最后目标界面校验数据', async () => {
// 进入目标界面
await homeNavigation.gotoModule('目标');
await page.locator('.m-table__fixed-left .employeeName', { hasText: '张伟' }).click();
await page.locator('.m-table__body-wrapper').last().waitFor();
await expect.soft(page.locator('.m-table__icon__warp')).toBeHidden();
await expect
.soft(
verify
.filter({ has: page.locator('.title', { hasText: '现金' }) })
.locator('.target_txt')
.last(),
)
.toContainText(`${Number(lastCash) + 50}`);
await expect(
verify
.filter({ has: page.locator('.title', { hasText: '消耗' }) })
.locator('.target_txt')
.last(),
).toContainText(`${Number(lastExpend) + 60}`);
// 点击上个月
await page.locator('.left_btn').last().click();
await expect(page.locator('.m-table__icon__warp')).toBeHidden();
await expect
.soft(
verify
.filter({ has: page.locator('.title', { hasText: '现金' }) })
.locator('.target_txt')
.last(),
)
.toContainText(`${Number(lastMonthCash) + 50}`);
await expect(
verify
.filter({ has: page.locator('.title', { hasText: '消耗' }) })
.locator('.target_txt')
.last(),
).toContainText(`${Number(lastMonthExpend) + 60}`);
});
});
});
test.describe('个人日结单', () => {
test('查看个人日结单', async ({ page, createCustomer, homeNavigation }) => {
let cash;
let expend;
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
const customer = createCustomer;
await test.step('购买项目A并消耗', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '赵军' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: '赵军' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 选择现金结算
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('进入流水获取赵军今日现金及消耗', async () => {
await homeNavigation.gotoModule('流水');
await page.locator('.tab_item', { hasText: '日结单' }).click();
await expect(page.locator('.m-table__empty')).not.toBeVisible();
await expect(page.locator('.m-table__loading')).toBeHidden();
await expect(page.locator('.m-table__body-wrapper tbody tr').first()).toBeVisible();
// 获取员工赵军在第几列
const allTrLine = page.locator('.m-table__header-wrapper th');
const nowLine = await allTrLine.allInnerTexts().then(text => {
return text.findIndex(item => item.includes('赵军'));
});
// 获取流水里赵军的今日现金及消耗
const codes = page.locator('.m-table__body-wrapper tbody tr');
cash = KeepOnlyNumbers(
await codes
.filter({ has: page.locator('td', { hasText: '现金' }) })
.locator('td')
.nth(nowLine)
.innerText(),
);
expend = KeepOnlyNumbers(
await codes
.filter({ has: page.locator('td', { hasText: '消耗' }) })
.locator('td')
.nth(nowLine)
.innerText(),
);
});
await test.step('进入目标获取赵军今日现金及消耗', async () => {
await homeNavigation.gotoModule('目标');
// 点击赵军进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '赵军' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
const coded = page.locator('.m-table__body-wrapper .main-table-body_tr');
await expect(
coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1),
).toContainText(cash);
await expect(
coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(3),
).toContainText(expend);
});
});
});
test.describe('门店看板', () => {
test('查看门店看板', async ({ page, createCustomers, homeNavigation }) => {
// E1 李娜
// E2 杨雪
// E3 赵伟
// F1 张凯
// 总部账号17770720220 a123456
// 门店一 17770720221 a123456
// 门店二: 17770720222 a123456
// 组长李娜139876543 a123456
let customer_a;
let customer_b;
let customer_c;
let coded;
// 各员工初始数据
let LNCash; //李娜
let LastLNCash; //李娜上月
let YXCash; //杨雪
let ZWCash; //赵伟
let ZKCash; //张凯
// 收银结算button
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
let customers: Customer[] = [];
await test.step('创建3个顾客', async () => {
customers = await createCustomers(3);
});
customer_a = customers[0];
customer_b = customers[1];
customer_c = customers[2];
await test.step('总部账号获取各门店各部门各员工数据', async () => {
// 进入目标界面获取初始数据
await homeNavigation.gotoModule('目标');
// 点击李娜进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
coded = page.locator('.m-table__body-wrapper .main-table-body_tr');
LNCash = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击上个月
await page.locator('.left_btn').last().click();
// await expect (coded.filter({has:page.locator('.is-center').last()}).locator('td .kpiType').first()).not.toBeEmpty()
await page.waitForTimeout(2000);
// 点击李娜进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取上月的现金以及消耗
LastLNCash = await coded
.filter({ has: page.locator('.is-center', { hasText: '15' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 返回下个月以便校验其他员工数据
await page.locator('.right_btn').last().click();
await expect(page.locator('.m-table__loading')).toBeHidden();
// 点击杨雪进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '杨雪' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
YXCash = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择部门
await page.locator('.needsclick', { hasText: '医美部' }).click();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '赵伟' })
.waitFor({ timeout: 2000 });
}).toPass();
// 点击赵伟进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '赵伟' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
ZWCash = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择门店
await page.locator('.shopSelect_shop_content').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
await page.locator('.customWith', { hasText: 'AT测试二店' }).click();
await page.locator('.shopSelect_shop_content', { hasText: 'AT测试二店' }).waitFor();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '张凯' })
.waitFor({ timeout: 2000 });
}).toPass();
// 点击张凯进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '张凯' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
ZKCash = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择门店
await page.locator('.shopSelect_shop_content').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
await page.locator('.customWith', { hasText: 'AT测试一店' }).click();
await page.locator('.shopSelect_shop_content', { hasText: 'AT测试一店' }).waitFor();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' })
.waitFor({ timeout: 2000 });
}).toPass();
});
await test.step('顾客A购买项目A 补录上月', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer_a.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer_a.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '李娜' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 点击补录
await page.locator('.recording_checkbox').click();
// 点击上个月
await page.locator('.ant-calendar-prev-month-btn').waitFor();
await page.locator('.ant-calendar-prev-month-btn').click();
// 选择上个月15号
await page.locator('.ant-calendar-cell', { hasText: '15' }).click();
await page.locator('.date_text .date', { hasText: '15' }).waitFor();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('顾客B购买项目A 选顾问', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer_b.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer_b.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '李娜' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('顾客B购买项目A 选美容师', async () => {
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer_b.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer_b.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '杨雪' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('顾客B购买项目B 选医美部', async () => {
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer_b.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer_b.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100029' }).click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.ant-radio-button-wrapper', { hasText: '医美部' }).click();
await page.locator('.check_row', { hasText: '赵伟' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('二店顾客C购买项目A选二店员工', async () => {
// 点击选择门店
await page.locator('.shop_select').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
// 选择二店
await page.locator('.check_box_container', { hasText: 'AT测试二店' }).click();
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer_c.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer_c.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '张凯' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('总部账号验证各门店各部门各员工数据', async () => {
// 进入目标界面核对数据
await homeNavigation.gotoModule('目标');
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择门店
await page.locator('.shopSelect_shop_content').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
await page.locator('.customWith', { hasText: 'AT测试一店' }).click();
await page.locator('.shopSelect_shop_content', { hasText: 'AT测试一店' }).waitFor();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' })
.waitFor({ timeout: 2000 });
}).toPass();
// 点击李娜进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
const LNCashed = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击杨雪进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '杨雪' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
const YXCashed = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择部门
await page.locator('.needsclick', { hasText: '医美部' }).click();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '赵伟' })
.waitFor({ timeout: 2000 });
}).toPass();
// 点击赵伟进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '赵伟' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
const ZWCashed = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择门店
await page.locator('.shopSelect_shop_content').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
await page.locator('.customWith', { hasText: 'AT测试二店' }).click();
await page.locator('.shopSelect_shop_content', { hasText: 'AT测试二店' }).waitFor();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '张凯' })
.waitFor({ timeout: 2000 });
}).toPass();
// 点击张凯进入个人目标
await page.locator('.m-table__fixed-left tbody .employeeName', { hasText: '张凯' }).click();
await Promise.any([
page.locator('.no_done').first().waitFor({ timeout: 5000 }),
page.locator('.no_start').first().waitFor({ timeout: 5000 }),
]);
// 获取今日的现金以及消耗
const ZKCashed = await coded
.filter({ has: page.locator('.is-center', { hasText: '今' }) })
.locator('td')
.nth(1)
.innerText();
// 关闭窗口
await page.locator('.close_icon').last().click();
// 点击选择门店
await expect(async () => {
await page.locator('.shop-picker-store').click();
await page.locator('.shopSelect_title', { hasText: '选择查询对象' }).waitFor();
// 选择门店
await page.locator('.shopSelect_shop_content').click();
await page.locator('.comSelect_title', { hasText: '选择' }).waitFor();
await page.locator('.customWith', { hasText: 'AT测试一店' }).click();
await page.locator('.shopSelect_shop_content', { hasText: 'AT测试一店' }).waitFor();
await page.locator('.shop_btn', { hasText: /^保\s存$/ }).click();
await page
.locator('.m-table__fixed-left tbody .employeeName', { hasText: '李娜' })
.waitFor({ timeout: 2000 });
}).toPass();
// 校验对比
expect(LNCashed * 1).toBe(LNCash * 1 + 50);
expect(YXCashed * 1).toBe(YXCash * 1 + 50);
expect(ZWCashed * 1).toBe(ZWCash * 1 + 100);
expect(ZKCashed * 1).toBe(ZKCash * 1 + 50);
});
});
test('展示KPI配置', async ({ page, homeNavigation }) => {
const goal = page.locator('.ant-checkbox-group .ant-col .ant-checkbox-wrapper');
const check = goal
.filter({ has: page.locator('.needsclick', { hasText: '划卡' }) })
.locator('.ant-checkbox-checked');
const title = page.locator('.m-table__header-wrapper thead th', { hasText: '划卡' });
await test.step('进入设置确认划卡处于勾选状态', async () => {
// 进入设置
await homeNavigation.gotoModule('设置');
await page.locator('.tab_item', { hasText: '目标' }).click();
await page.locator('.tag_content_title', { hasText: '目标维度' }).waitFor();
await expect(async () => {
await goal
.filter({ has: page.locator('.needsclick', { hasText: '划卡' }) })
.locator('.ant-checkbox')
.click();
await expect(check).toBeVisible({ timeout: 2000 });
}).toPass();
});
await test.step('进入目标查看划卡列', async () => {
// 进入目标
await homeNavigation.gotoModule('目标');
await page.locator('.summary').first().waitFor();
// 判断划卡存在
await expect(title).toBeVisible();
});
await test.step('进入设置关闭划卡', async () => {
// 进入设置
await homeNavigation.gotoModule('设置');
await page.locator('.tab_item', { hasText: '目标' }).click();
await page.locator('.tag_content_title', { hasText: '目标维度' }).waitFor();
await goal
.filter({ has: page.locator('.needsclick', { hasText: '划卡' }) })
.locator('.ant-checkbox')
.click();
await expect(check).not.toBeVisible();
});
await test.step('判断目标不存在划卡', async () => {
// 进入目标
await homeNavigation.gotoModule('目标');
await page.locator('.summary').first().waitFor();
await expect(title).not.toBeVisible();
});
await test.step('重复以上操作恢复设置', async () => {
// 进入设置
await homeNavigation.gotoModule('设置');
await page.locator('.tab_item', { hasText: '目标' }).click();
await page.locator('.tag_content_title', { hasText: '目标维度' }).waitFor();
await goal
.filter({ has: page.locator('.needsclick', { hasText: '划卡' }) })
.locator('.ant-checkbox')
.click();
await expect(check).toBeVisible();
// 进入目标
await homeNavigation.gotoModule('目标');
await page.locator('.summary').first().waitFor();
await expect(title).toBeVisible();
});
});
});
test.describe('指标看板', () => {
test('查看指标看板', async ({ page, createCustomer, homeNavigation }) => {
// 定义初始获取的数据
let cash;
let expend;
let LastMonthCash;
let LastMonthExpend;
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
// 获取员工定位器
const $$employeeHeader = page.locator('.kpiManagement .m-table__header-wrapper tr th');
const $$valueBody = page.locator('.kpiManagement .m-table__body-wrapper').last().locator('tbody').first();
const customer = createCustomer;
/**@type {number} 员工所在列 */
let nowColumn;
// 今天在第几行
let todayLine = (new Date().getDate() - 1) * 3;
// 15号在第几行
let fifteenLine = (15 - 1) * 3;
await test.step('进入目标界面获取初始数据', async () => {
// 进入目标界面获取初始数据
await homeNavigation.gotoModule('目标');
// 进入现金KPI
await page.locator('.kpiTh', { hasText: '现金' }).click();
await page.locator('.stripe_odd').first().waitFor();
// 获取员工所在列
nowColumn = await $$employeeHeader.allInnerTexts().then(text => {
return text.findIndex(item => item === '王芳');
});
if (nowColumn === -1) {
throw new Error('员工王芳不存在');
}
// 获取初始现金
cash = await $$valueBody.locator('tr').nth(todayLine).locator('td').nth(nowColumn).innerText();
// 点击上个月,获取包含 '15' 的行索引
await Promise.all([
page.locator('.left_btn').last().click(),
page.waitForResponse(res => res.url().includes('/user_kpi') && res.status() === 200),
]);
// 等待上个月最后一天的日差额加载出来
await page
.locator('.m-table__body-wrapper')
.last()
.locator('tbody')
.first()
.locator('tr')
.last()
.locator('.kpiType', { hasText: '日差额' })
.waitFor();
// 获取上个月初始现金
LastMonthCash = await $$valueBody.locator('tr').nth(fifteenLine).locator('td').nth(nowColumn).innerText();
// 关闭现金窗口
await page.locator('.close').last().click();
// 进入消耗KPI获取初始消耗
await page.locator('.kpiTh', { hasText: '消耗' }).click();
await page.locator('.stripe_odd').first().waitFor();
expend = await $$valueBody.locator('tr').nth(todayLine).locator('td').nth(nowColumn).innerText();
// 点击上个月,获取上个月初始消耗
await Promise.all([
page.locator('.left_btn').last().click(),
page.waitForResponse(res => res.url().includes('/user_kpi') && res.status() === 200),
]);
// 等待上个月最后一天的日差额加载出来
await page
.locator('.m-table__body-wrapper')
.last()
.locator('tbody')
.first()
.locator('tr')
.last()
.locator('.kpiType', { hasText: '日差额' })
.waitFor();
// 关闭消耗窗口
await page.locator('.close').last().click();
});
await test.step('购买项目A并消耗(补录上月)', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '王芳' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: '王芳' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 点击补录
await page.locator('.recording_checkbox').click();
// 点击上个月
await page.locator('.ant-calendar-prev-month-btn').waitFor();
await page.locator('.ant-calendar-prev-month-btn').click();
// 选择上个月15号
await page.locator('.ant-calendar-cell', { hasText: '15' }).click();
await page.locator('.date_text .date', { hasText: '15' }).waitFor();
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('购买项目A并消耗(本月)', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: '100028' }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: '王芳' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: '王芳' }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
// 选择现金结算
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('最后目标界面校验数据', async () => {
// 进入目标界面
await homeNavigation.gotoModule('目标');
// 进入现金KPI
await page.locator('.kpiTh', { hasText: '现金' }).click();
await page.locator('.stripe_odd').first().waitFor();
// 获取王芳今天的现金值
const nowCash = $$valueBody.locator('tr').nth(todayLine).locator('td').nth(nowColumn);
await expect(nowCash).toContainText(`${Number(cash) + 50}`);
// 点击上个月
await Promise.all([
page.locator('.left_btn').last().click(),
page.waitForResponse(res => res.url().includes('/user_kpi') && res.status() === 200),
]);
// 等待上个月最后一天的日差额加载出来
await page
.locator('.m-table__body-wrapper')
.last()
.locator('tbody')
.first()
.locator('tr')
.last()
.locator('.kpiType', { hasText: '日差额' })
.waitFor();
// 获取上个月现金
const nowLastMonthCash = $$valueBody.locator('tr').nth(fifteenLine).locator('td').nth(nowColumn);
await expect(nowLastMonthCash).toContainText(`${Number(LastMonthCash) + 50}`);
// 关闭现金窗口
await page.locator('.close').last().click();
// 进入消耗KPI
await page.locator('.kpiTh', { hasText: '消耗' }).click();
await page.locator('.stripe_odd').first().waitFor();
// 获取消耗值
const nowExpend = $$valueBody.locator('tr').nth(todayLine).locator('td').nth(nowColumn);
await expect(nowExpend).toContainText(`${Number(expend) + 60}`);
// 点击上个月
await Promise.all([
page.locator('.left_btn').last().click(),
page.waitForResponse(res => res.url().includes('/user_kpi') && res.status() === 200),
]);
// 等待上个月最后一天的日差额加载出来
await page
.locator('.m-table__body-wrapper')
.last()
.locator('tbody')
.first()
.locator('tr')
.last()
.locator('.kpiType', { hasText: '日差额' })
.waitFor();
// 获取上个月消耗
const nowLastMonthExpend = $$valueBody.locator('tr').nth(fifteenLine).locator('td').nth(nowColumn);
await expect(nowLastMonthExpend).toContainText(`${Number(LastMonthExpend) + 60}`);
});
});
});
test.describe('精细目标', () => {
test('设置精细化目标', async ({ page, homeNavigation, createCustomCustomer, numberInput }) => {
const project = { no: '100012', name: '雪肌晶纯护理', Price: 300 };
const employee = staffData.firstStore.firstSector.employee_8;
const customer = new Customer(1, 1, { employees: [{ level: '医生', name: employee.name }] });
let firstStoreFirstSector = staffData.firstStore.firstSector;
await test.step('新建有员工的顾客', async () => {
await createCustomCustomer(customer);
});
await test.step('给员工设置目标', async () => {
await homeNavigation.gotoModule('目标');
// 设置目标
await page.getByRole('button', { name: '设置目标' }).click();
// 选择部门
await page.getByRole('combobox').click();
await page.getByRole('option', { name: firstStoreFirstSector.name }).click();
// 弹窗定位器
const popupContent = page.locator('.popup_content .m-table__body-wrapper');
// 判断员工是否存在
await expect(popupContent).toContainText(employee.name);
// 选择指定员工的现金列
await popupContent.locator('tbody > tr', { hasText: employee.name }).locator('td').nth(1).click();
await numberInput.setValue(1);
await numberInput.confirmValue();
await page.getByRole('button', { name: /保\s存/ }).click();
});
await test.step('给顾客设置服务项目,查看设置的服务项目', async () => {
// 进入精细化管理页面
await page.locator('.left_view .tab_item', { hasText: '精细化管理' }).click();
await page.getByRole('cell', { name: '顾客' }).waitFor();
// 进入设置目标页面
await page.getByRole('button', { name: '设置目标' }).click();
await Promise.all([
await page.locator('.com_picker .label', { hasText: employee.name }).click(),
await page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
// 设置精细化窗口定位器
const settingPointViewLocator = page.locator('.flow_content');
// 设置顾客定位器
const settingCustomerLocator = settingPointViewLocator.locator(
'.m-table__body-wrapper .main-table-body_tr',
);
// 查询指定顾客
const userTr = settingCustomerLocator.filter({ hasText: customer.username });
await page.locator('.filter_box').getByRole('button').click();
await page.getByPlaceholder('输入顾客姓名、手机号、首字母搜索').fill(customer.phone);
await Promise.all([
page.locator('.search_btn > svg').click(),
page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
await expect(userTr).toBeVisible();
// 增加指定项目
await userTr.locator('td', { hasText: '增加' }).first().click();
// 项目选择器
const projectPickerLocator = page.locator('.com_picker', {
has: page.locator('.comSelect_title', { hasText: '添加项目' }),
});
await projectPickerLocator.locator('.search_box input').fill(project.no);
await projectPickerLocator.getByRole('button', { name: /搜\s索/ }).click();
await expect(async () => {
await projectPickerLocator.getByLabel(project.name).uncheck();
await projectPickerLocator.getByLabel(project.name).check();
await expect(
page.locator('.item_modal_tab .left_menu-item', { hasText: '全部' }).locator('.menu-item-dot'),
).toBeVisible({ timeout: 2000 });
}).toPass();
await page.getByRole('button', { name: '确定选择' }).click();
await numberInput.setValue(1);
await numberInput.confirmValue();
await expect(userTr).toContainText(project.name);
// 关闭设置目标页面
await page.locator('.close_btn > .icon > svg').click();
// 判断设置的项目状态
await expect(page.locator('.main-table-body_tr', { hasText: customer.username }).first()).toContainText(
project.name,
);
});
});
test('完成精细目标', async ({ page, homeNavigation, createCustomCustomer, numberInput }) => {
const project = { no: '100012', name: '雪肌晶纯护理', Price: 300 };
const employee = staffData.firstStore.firstSector.employee_8;
const firstStoreFirstSector = staffData.firstStore.firstSector;
const customer = new Customer(1, 1, { employees: [{ level: '医生', name: employee.name }] });
await test.step('新建有员工的顾客', async () => {
await createCustomCustomer(customer);
});
await test.step('给员工设置目标', async () => {
await homeNavigation.gotoModule('目标');
// 设置目标
await page.getByRole('button', { name: '设置目标' }).click();
// 选择部门
await page.getByRole('combobox').click();
await page.getByRole('option', { name: firstStoreFirstSector.name }).click();
// 弹窗定位器
const popupContent = page.locator('.popup_content .m-table__body-wrapper');
// 判断员工是否存在
await expect(popupContent).toContainText(employee.name);
// 选择指定员工的现金列
await popupContent.locator('tbody > tr', { hasText: employee.name }).locator('td').nth(1).click();
await numberInput.setValue(1);
await numberInput.confirmValue();
await page.getByRole('button', { name: /保\s存/ }).click();
});
await test.step('给顾客设置服务项目,查看设置的服务项目, 查看项目的状态', async () => {
// 进入精细化管理页面
await page.locator('.left_view .tab_item', { hasText: '精细化管理' }).click();
await page.getByRole('cell', { name: '顾客' }).waitFor();
// 进入设置目标页面
await page.getByRole('button', { name: '设置目标' }).click();
await Promise.all([
await page.locator('.com_picker .label', { hasText: employee.name }).click(),
await page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
// 设置精细化窗口定位器
const settingPointViewLocator = page.locator('.flow_content');
// 设置顾客定位器
const settingCustomerLocator = settingPointViewLocator.locator(
'.m-table__body-wrapper .main-table-body_tr',
);
// 查询指定顾客
const userTr = settingCustomerLocator.filter({ hasText: customer.username });
await page.locator('.filter_box').getByRole('button').click();
await page.getByPlaceholder('输入顾客姓名、手机号、首字母搜索').fill(customer.phone);
await Promise.all([
page.locator('.search_btn > svg').click(),
page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
await expect(userTr).toBeVisible();
// 增加指定项目
await userTr.locator('td', { hasText: '增加' }).first().click();
// 项目选择器
const projectPickerLocator = page.locator('.com_picker', {
has: page.locator('.comSelect_title', { hasText: '添加项目' }),
});
await projectPickerLocator.locator('.search_box input').fill(project.no);
await projectPickerLocator.getByRole('button', { name: /搜\s索/ }).click();
await expect(async () => {
await projectPickerLocator.getByLabel(project.name).uncheck();
await projectPickerLocator.getByLabel(project.name).check();
await expect(
page.locator('.item_modal_tab .left_menu-item', { hasText: '全部' }).locator('.menu-item-dot'),
).toBeVisible({ timeout: 2000 });
}).toPass();
await page.getByRole('button', { name: '确定选择' }).click();
await numberInput.setValue(1);
await numberInput.confirmValue();
await expect(userTr).toContainText(project.name);
// 等待设置项目后的页面
await Promise.all([
page.locator('.close_btn > .icon > svg').click(),
page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
});
await test.step('选择顾客去开单,购买目标项目,选择目标员工结算', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customer.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customer.phone }).click();
// 选择项目
await page.locator('.project_list .number', { hasText: project.no }).click();
// 选择添加员工
await page.locator('button.staff_btn').click();
await page.locator('.check_row', { hasText: employee.name }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /^结\s算$/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('进入目标页面,查看目标项目状态', async () => {
await homeNavigation.gotoModule('目标');
await page.locator('.left_view .tab_item', { hasText: '精细化管理' }).click();
await page.waitForLoadState('domcontentloaded');
const customerTr = page
.locator('#app tr')
.filter({ has: page.locator('td', { hasText: customer.username }) });
// 打开现金列tip
await customerTr.locator('.service_box .item_li use').first().click();
// 判断提示窗口内容
await expect(page.getByRole('tooltip')).toContainText('已经完成');
});
});
test('完成惊喜业绩', async ({ page, homeNavigation, createCustomers, numberInput }) => {
const project = { no: '100012', name: '雪肌晶纯护理', Price: 300 };
const employee = staffData.firstStore.firstSector.employee_8;
let firstStoreFirstSector = staffData.firstStore.firstSector;
let firstStoreSecondSector = staffData.firstStore.secondSector;
let customers: Customer[] = [];
await test.step('创建两个顾客', async () => {
customers = await createCustomers(2);
});
const customerA = customers[0];
const customerB = customers[1];
await test.step('给顾客分配员工', async () => {
await homeNavigation.gotoModule('顾客');
// 根据手机号进行搜索,进入顾客详情页面
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customerA.phone);
await page.locator('.ant-input-suffix .search_btn', { hasText: '搜索' }).click();
await page.locator('.custom_content', { hasText: customerA.phone }).click();
await page.locator('.m-table__fixed-left').getByText(customerA.username).first().click();
// 分配员工
await page.locator('.person_content').waitFor();
await page.locator('.user_name').locator('i').click();
// 打开员工分配页面
await page.locator('.member_info_list', { hasText: '顾问' }).locator('.beautician_box').click();
// 选择分配的员工
await page.getByRole('treeitem', { name: employee.name }).click();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.getByRole('button', { name: /保\s存/ }).click();
// 返回顾客模块
await page.locator('.close_icons > svg').click();
});
await test.step('给员工设置目标', async () => {
await homeNavigation.gotoModule('目标');
await page.getByRole('button', { name: '设置目标' }).click();
const department = await page.getByRole('combobox').innerText();
if (customerA.department === 1) {
if (department !== firstStoreFirstSector.name) {
await page.getByRole('combobox').click();
await page.getByRole('option', { name: firstStoreFirstSector.name }).click();
}
} else if (customerA.department === 2) {
if (department !== firstStoreSecondSector.name) {
await page.getByRole('combobox').click();
await page
.getByRole('option', {
name: firstStoreSecondSector.name,
})
.click();
}
}
const popupContent = page.locator('.popup_content .m-table__body-wrapper');
await expect(popupContent).toContainText(employee.name);
// 选择某个员工的现金列
await popupContent.locator('tbody > tr', { hasText: employee.name }).locator('td').nth(1).click();
await numberInput.setValue(1);
await numberInput.confirmValue();
await page.getByRole('button', { name: /保\s存/ }).click();
});
await test.step('给顾客设置服务项目,查看设置的服务项目, 查看项目的状态', async () => {
// await page.pause();
await page.locator('.left_view .tab_item', { hasText: '精细化管理' }).click();
await page.getByRole('cell', { name: '顾客' }).waitFor();
await page.getByRole('button', { name: '设置目标' }).click();
await Promise.all([
await page.locator('.com_picker .label', { hasText: employee.name }).click(),
await page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
// 设置精细化窗口
const settingPointViewLocator = page.locator('.flow_content');
// 设置顾客行
const settingCustomerLocator = settingPointViewLocator.locator(
'.m-table__body-wrapper .main-table-body_tr',
);
const userTr = settingCustomerLocator.filter({ hasText: customerA.username });
await page.locator('.filter_box').getByRole('button').click();
await page.getByPlaceholder('输入顾客姓名、手机号、首字母搜索').fill(customerA.phone);
// 查询指定顾客
await Promise.all([
page.locator('.search_btn > svg').click(),
page.waitForResponse(res => res.url().includes('/user_kpi_detail') && res.status() === 200),
]);
await expect(userTr).toBeVisible();
await userTr.locator('td', { hasText: '增加' }).first().click();
await page.waitForTimeout(2000);
// 项目选择器
const projectPickerLocator = page.locator('.com_picker', {
has: page.locator('.comSelect_title', { hasText: '添加项目' }),
});
await projectPickerLocator.locator('.search_box input').fill(project.no);
await projectPickerLocator.getByRole('button', { name: /搜\s索/ }).click();
await expect(async () => {
await projectPickerLocator.locator('.label', { hasText: project.no }).click();
await page.getByRole('button', { name: '确定选择' }).click();
await expect(page.locator('.popup_content', { hasText: '修改次数' })).toBeVisible({
timeout: 2000,
});
}).toPass();
await numberInput.setValue(1);
await numberInput.confirmValue();
await expect(userTr).toContainText(project.name);
await page.locator('.close_btn > .icon > svg').click();
});
await test.step('选择顾客A去开单购买目标项目选择目标员工结算', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customerA.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customerA.phone }).click();
// 选择项目
await page.locator('.project_list .number', { hasText: project.no }).click();
await page.getByRole('button', { name: '体' }).click();
await page.locator('.popup_content').getByText('普通').click();
// 选择添加员工
await page.locator('button.staff_btn').click();
await page.locator('.check_row', { hasText: employee.name }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /^结\s算$/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('选择顾客B去开单购买项目并消耗选择目标员工结算', async () => {
await homeNavigation.gotoModule('收银');
await page.getByRole('button', { name: /开\s单/ }).click();
await page.getByPlaceholder('姓名(拼音首字)、手机号、档案号搜索').fill(customerB.phone);
await page.locator('.ant-input-suffix', { hasText: '搜索' }).click();
await page.locator('.member_list .phone', { hasText: customerB.phone }).click();
// 购买并消耗
await page.locator('.project_list .number', { hasText: project.no }).click();
await page.locator('#shoppingCart .commodity_list li').first().click();
// 购买添加员工
await page.locator('#buyList .staff_btn').click();
await page.locator('.check_row', { hasText: employee.name }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
// 消耗添加员工
await page.locator('.use_list .staff_btn').click();
await page.locator('.check_row', { hasText: employee.name }).getByRole('checkbox').check();
await page.getByRole('button', { name: /确\s认/ }).click();
await page.locator('.pay_btn', { hasText: /结\s算/ }).click();
await page.getByLabel('推送消费提醒').uncheck();
await page.getByLabel('结算签字').uncheck();
const leftPaymentInfoItem = page.locator('.left .paymentmain .paymentInfoItem');
await leftPaymentInfoItem.filter({ hasText: '现金' }).click();
await page.getByRole('button', { name: /结\s算/ }).click();
});
await test.step('进入目标页面查看顾客A和顾客B的状态', async () => {
await homeNavigation.gotoModule('目标');
await page.locator('.left_view .tab_item', { hasText: '精细化管理' }).click();
await page.waitForLoadState('domcontentloaded');
// 获取顾客A的项目状态
const customerATr = page
.locator('#app tr')
.filter({ has: page.locator('td', { hasText: customerA.username }) });
await customerATr.locator('.service_box .item_li use').first().click();
await expect(page.getByRole('tooltip')).toContainText('已经完成');
// 获取顾客B的项目状态
const customerBTr = page
.locator('#app tr')
.filter({ has: page.locator('td', { hasText: customerB.username }) });
await expect(customerBTr).toContainText('惊喜');
});
});
test('查看员工精细化目标', async ({ page, homeNavigation }) => {
let cashCustomer;
let cashProject;
let cashGoal;
let expendCustomer;
let expendProject;
let expendGoal;
await test.step('获取员工目标数据', async () => {
// 进入目标页面
await homeNavigation.gotoModule('目标');
await page.locator('.tab_item', { hasText: '精细化管理' }).click();
await expect.soft(page.locator('.m-table__icon__warp')).toBeHidden();
await expect(page.locator('.custom_txt')).not.toBeVisible();
const code = page.locator('.m-table__body-wrapper tbody tr').first();
// 现金顾客、项目、目标
cashCustomer = await code.locator('td').nth(1).innerText();
// 保留从第一个字符到x之前
cashProject = (await code.locator('td').nth(2).innerText()).match(/^[^x]+/)?.[0];
cashGoal = await code.locator('td').nth(3).locator('.has_done').innerText();
// 消耗顾客、项目、目标
expendCustomer = await code.locator('td').nth(1).innerText();
expendProject = (await code.locator('td').nth(5).innerText()).match(/^[^x]+/)?.[0];
expendGoal = await code.locator('td').nth(6).locator('.has_done').innerText();
});
await test.step('获取员工精细化数据做对比', async () => {
// 点击员工进入员工精细化管理
await page.locator('.m-table__fixed-left tbody tr').first().locator('td').first().click();
await page.locator('.title', { hasText: '员工精细化目标' }).waitFor();
await expect.soft(page.locator('.m-table__icon__warp')).toBeHidden();
await page.locator('.loading_container').waitFor({ state: 'hidden' });
// 获取最后一个表格行
const cedes = page.locator('.m-table__body-wrapper').last().locator('tr').first();
// 现金
await expect.soft(cedes.locator('td').nth(0)).toContainText(cashCustomer);
await expect.soft(cedes.locator('td').nth(1)).toContainText(cashProject);
await expect.soft(cedes.locator('td').nth(2)).toContainText(cashGoal);
// 消耗
await expect.soft(cedes.locator('td').nth(0)).toContainText(expendCustomer);
await expect.soft(cedes.locator('td').nth(4)).toContainText(expendProject);
await expect(cedes.locator('td').nth(5)).toContainText(expendGoal);
});
});
});