diff --git a/package-lock.json b/package-lock.json index 1c49860..963af29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "csv-parse": "^5.5.6", "sharp": "^0.33.5", "tesseract.js": "^5.1.1" }, @@ -480,6 +481,12 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/csv-parse": { + "version": "5.5.6", + "resolved": "https://registry.npmmirror.com/csv-parse/-/csv-parse-5.5.6.tgz", + "integrity": "sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==", + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.3.tgz", diff --git a/package.json b/package.json index 2f02122..1b0e4a7 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "hlk_codegen": "npx playwright codegen https://hlk.meiguanjia.net/#/", "mgj_codegen": "npx playwright codegen https://vip1.meiguanjia.net/shair/?v=mgj", "zhb_codegen": "npx playwright codegen https://shengyibao.meiguanjia.net/young/", + "zhb_csv-100": "npx playwright test ./tests/zhb/csv-demo.spec.js:13 --repeat-each=100", "ui": "npx playwright test --ui", "pwi": "npm ci && npx playwright install", "pwu": "npx playwright install --with-deps" @@ -21,6 +22,7 @@ "dotenv": "^16.4.5" }, "dependencies": { + "csv-parse": "^5.5.6", "sharp": "^0.33.5", "tesseract.js": "^5.1.1" } diff --git a/tests/hlk/demo.spec.js b/tests/hlk/demo.spec.js index a8d632b..31f99c7 100644 --- a/tests/hlk/demo.spec.js +++ b/tests/hlk/demo.spec.js @@ -45,7 +45,7 @@ for (let i = 0; i < 3; i++) { await h5Page.locator('.bar_item', { hasText: '商城' }).click(); await expect(h5Page.locator('.title', { hasText: '商城' })).toBeVisible(); await h5Page.locator('.li span', { hasText: '全部' }).click(); - await h5Page.locator('.p-item').nth(1).click(); + await h5Page.locator('.p-item').nth(2).click(); await h5Page.waitForLoadState(); await h5Page.getByText('立即购买').click(); await h5Page diff --git a/tests/zhb/csv-demo.spec.js b/tests/zhb/csv-demo.spec.js new file mode 100644 index 0000000..1d17b73 --- /dev/null +++ b/tests/zhb/csv-demo.spec.js @@ -0,0 +1,118 @@ +const path = require('path'); +const { parse } = require('csv-parse/sync'); +const fs = require('fs'); +const { faker } = require('@faker-js/faker'); +const { test, expect } = require('./fixture/common'); +const { Customer } = require('./pom/customerPage'); + +const records = parse(fs.readFileSync(path.join(__dirname, 'zhb.csv')), { + columns: true, + skip_empty_lines: true, +}); + +test('csv', async ({ zhbPage }, workerInfo) => { + console.log(records.length); + const $area = zhbPage + .locator('.area') + .filter({ has: zhbPage.locator('.area-name', { hasText: '二楼' }) }); + const $$room = $area.locator('.room-list .room'); + + // 随机csv文件中的任意一个顾客 + const record = records[faker.number.int({ min: 0, max: records.length - 1 })]; + const { name, phone } = record; + console.log({ name, phone }); + const customer = new Customer({ name: name, phone: name }); + + // 使用房间名称 + let useRoomName; + await test.step('购买商品', async () => { + await zhbPage.locator('#tab_main li').filter({ hasText: '营业' }).click(); + const $emptyRoom = $$room + .filter({ has: zhbPage.getByText('空房') }) + .nth(workerInfo.workerIndex % 3); + useRoomName = await $emptyRoom.locator('.roomName').innerText(); + expect(useRoomName).not.toBeNull(); + await $emptyRoom.click(); + await expect(async () => { + if (await zhbPage.locator('.close > .iconfont').first().isVisible()) { + await zhbPage.locator('.close > .iconfont').first().click(); + } + await zhbPage.getByRole('button', { name: '选择顾客' }).click({ timeout: 3000 }); + await expect(zhbPage.locator('#page_searchMember').getByText('创建会员')).toBeVisible(); + }).toPass(); + await zhbPage + .getByRole('textbox', { name: '输入会员手机号或姓名或卡号搜索' }) + .fill(customer.phone, { delay: 100 }); + await zhbPage.locator('#page_searchMember svg').click(); + + const $customerTr = zhbPage + .locator('.list-warp') + .filter({ has: zhbPage.locator('.name', { hasText: customer.name }) }); + await $customerTr.locator('.list-body').first().click(); + + await zhbPage.getByText('项目开单').click(); + await expect(zhbPage.locator('#page_roomDetail').getByText('服务项目')).toBeVisible(); + await zhbPage.getByText('选择', { exact: true }).nth(1).click(); + await expect(zhbPage.locator('#serviceSelector').getByText('项目选择')).toBeVisible(); + await zhbPage + .locator('.goods-content-item') + .nth(faker.number.int({ min: 0, max: 14 })) + .click(); + await zhbPage.locator('#serviceSelector').getByText('确认').click(); + await zhbPage + .locator('div') + .filter({ hasText: /^明星足浴$/ }) + .locator('span') + .first() + .click(); + await zhbPage.getByRole('button', { name: '完成开单' }).click(); + await expect(zhbPage.getByRole('button', { name: '结账' })).toBeVisible({ timeout: 30_000 }); + await zhbPage.getByRole('button', { name: '结账' }).click(); + await zhbPage.locator('#page_footBathPay').getByText('结算签字').click(); + + await expect(async () => { + await zhbPage.locator('#page_footBathPay li').filter({ hasText: '现金' }).click(); + await expect(zhbPage.locator('#page_footBathPay li').filter({ hasText: '现金' })).toHaveClass( + /selected/ + ); + await zhbPage + .locator('#page_footBathPay span') + .filter({ hasText: /结\s算/ }) + .click(); + await expect(zhbPage.getByText('顾客满意度点评')).toBeVisible({ timeout: 2000 }); + }).toPass(); + + await zhbPage.getByText('不想评价').click(); + await zhbPage.locator('#page_footBathPay').getByText('立即返回').click(); + }); + + await test.step('起钟下钟,清理房间', async () => { + const $cleanRoom = $$room.filter({ + has: zhbPage.locator('.roomName', { hasText: new RegExp(`^${useRoomName}$`) }), + }); + await expect($cleanRoom).toContainText('已结清'); + await $cleanRoom.click(); + await zhbPage.getByText('技师操作').click(); + await zhbPage.getByText('起钟', { exact: true }).click(); + await zhbPage.getByText('起钟成功!').click(); + await zhbPage.getByText('技师操作').click(); + await zhbPage.getByText('下钟', { exact: true }).click(); + await zhbPage + .locator('div') + .filter({ hasText: /^确认返回$/ }) + .locator('div') + .first() + .click(); + await zhbPage.getByRole('button', { name: '不需要' }).click(); + + await expect($cleanRoom).toContainText('打扫'); + await $cleanRoom.click(); + await zhbPage + .locator('div') + .filter({ hasText: /^确定取消$/ }) + .locator('div') + .first() + .click(); + await expect($cleanRoom).toContainText('空房'); + }); +}); diff --git a/tests/zhb/zhb.csv b/tests/zhb/zhb.csv new file mode 100644 index 0000000..7e3cd39 --- /dev/null +++ b/tests/zhb/zhb.csv @@ -0,0 +1,201 @@ +name,phone +郸志国,12334502225 +纵佳琪,12352301430 +马熙瑶,12350424001 +应国平,12314501244 +委强,12322301255 +吕苡沫,12314440133 +柴沐辰,12311131155 +史国香,12333211154 +易天娇,12351430503 +靖敬彪,12321535101 +贡秀珍,12352123355 +悉艺涵,12311403141 +丁国芳,12343515153 +喻芳,12311322132 +析晨阳,12344201554 +酒建国,12332133555 +窦智杰,12304133243 +玉子豪,12314500535 +渠建军,12314142045 +甲婷婷,12340453445 +巫娟,12320023214 +扈斌,12324211053 +位杰,12311524133 +斛沐阳,12311151435 +驹志国,12305534111 +盘美方,12322214351 +柯婷,12314322025 +马涛,12340204331 +东政君,12332111030 +梁玉兰,12355420144 +安丽,12302350005 +赫俊杰,12341541431 +尉迟海燕,12313530222 +礼国珍,12321141225 +行梓豪,12343224431 +拉国荣,12351411412 +练国栋,12312010324 +戎沐宸,12343432310 +翟宇,12344114011 +桂梓晨,12340344054 +斋志明,12305321102 +及万佳,12335454335 +前雪,12345534331 +伦英,12321322045 +柏立伟,12345251522 +招欣怡,12324401040 +首茗泽,12323330351 +计乙萍,12303514002 +线婷方,12324501502 +九秀珍,12344040353 +茂蒙,12312210221 +红婷方,12340215445 +扈倩,12354532031 +原立伟,12342524245 +祖丽芳,12322124425 +蓬雨欣,12340321430 +定瑜,12350252355 +望丽萍,12311313430 +铁家豪,12352502012 +闳雅鑫,12313242150 +单于燕,12314042132 +杜奕泽,12345103503 +尉丽芳,12323404415 +徭国平,12321014220 +羽志国,12311511234 +弥安琪,12322541510 +阮梓玥,12302200542 +呼波,12351535225 +玉呈轩,12304451524 +针熙瑶,12354523544 +帖国平,12305535553 +班天娇,12330411042 +藏秀珍,12304203153 +计国琴,12351531450 +鄢国珍,12343500300 +屈国兰,12313202405 +齐子欣,12355341152 +曹安琪,12355140413 +甫建华,12354544421 +苗丽芬,12311142041 +完倩,12324441204 +綦雯静,12304221302 +蔺志明,12322530542 +磨晨阳,12315334001 +友秀珍,12312034423 +历燕,12330435540 +飞文昊,12315150424 +萧鹏,12333512443 +用中海,12334505210 +竭智杰,12312530202 +次国琴,12331300513 +乙一诺,12304041145 +析志明,12340411012 +曲红,12320421131 +闫馨羽,12332235531 +卷语桐,12305350101 +旷丹,12351401021 +植玉梅,12340034300 +祖国栋,12310142153 +乙艺涵,12301532402 +海芳,12313345003 +枝敬彪,12324501125 +雍国秀,12340243412 +章佳紫林,12320333352 +充丽萍,12322423001 +百雅鑫,12333040513 +鹿治涛,12324533401 +慎文韬,12350423141 +谯梓涵,12301052044 +针振东,12353344501 +绍奕辰,12350005540 +仉文昊,12332320502 +元梓玥,12335424410 +祝浩宇,12311335301 +来斌,12300325534 +刁志明,12320244541 +首兰英,12311150011 +练安琪,12342301055 +唐雯静,12312505520 +郝天娇,12312520301 +庄丽芳,12353444410 +源依诺,12342341501 +诸丽芬,12312415203 +朱慧,12344511420 +绍国辉,12341315304 +肥志明,12304445132 +包文韬,12330305102 +钱倩,12350342140 +樊丽芳,12332020302 +钱雨欣,12304114004 +鱼静,12331411232 +速宇泽,12331502245 +叔沐宸,12335305514 +进国英,12314454234 +费慧,12304155020 +漆治文,12352421501 +示雪,12353154301 +劳颖,12343235112 +谈馥君,12343113130 +兆呈轩,12320135205 +萧文韬,12304320034 +漫军,12321552123 +施国珍,12330141235 +纳静怡,12341035053 +贰阳,12305451142 +呼义轩,12315402403 +植语桐,12335354425 +路国荣,12304330054 +支梓豪,12333434504 +蔚宇航,12321411124 +第宇航,12342053534 +校海燕,12301142130 +纳喇诗雨,12323221524 +浑呈轩,12351243530 +弓梓馨,12353030231 +常玉梅,12352425540 +冀丽萍,12343501540 +北民,12321312355 +栋勇,12321145441 +原桂兰,12352325455 +陈榕融,12315235050 +况伟,12353031413 +丁浩辰,12345310354 +郭斌,12352334430 +巴蒙,12344251134 +可艳,12310255512 +玄浩辰,12331503043 +沙呈轩,12302013431 +荤成,12344214445 +林熙瑶,12305423343 +葛梓睿,12314114055 +湛斌,12345150514 +由静,12300130254 +侯振东,12324015213 +贺单,12301145101 +所宇轩,12331420152 +颜颖,12300005420 +咎玉梅,12352454144 +占俊杰,12324402343 +觉罗秀珍,12311240034 +范姜丽,12330542141 +弘梓浩,12343343451 +通雨欣,12331513024 +丘梓诚,12344112043 +贵梓晨,12311414030 +狄悦,12332305454 +穆凤英,12335205455 +金智杰,12301542505 +蒙癸霖,12305252022 +诺兰英,12303005354 +帛娟,12304243114 +在国英,12355121223 +严芳,12355412233 +狄治文,12320503352 +律雨欣,12345523042 +偶敬彪,12332433431 +求佳琪,12300144202 +唐中海,12351305521 +第治涛,12300442432 +壬家明,12335343552 \ No newline at end of file