2026-03-02 21:44:03 +08:00
|
|
|
import { expect, Page } from '@playwright/test'
|
|
|
|
|
|
|
|
|
|
export const USERNAME = process.env.ERP_USER || 'admin'
|
|
|
|
|
export const PASSWORD = process.env.ERP_PASS || 'admin123'
|
|
|
|
|
|
2026-03-06 02:02:59 +08:00
|
|
|
const PATH_TO_MENU_TEXT: Record<string, string> = {
|
|
|
|
|
'/production/report/need': '采购计划需求表',
|
|
|
|
|
'/production/plan-order': '生产计划单',
|
|
|
|
|
'/production/purchase-plan': '采购计划单',
|
|
|
|
|
'/production/work-order': '生产订单',
|
|
|
|
|
'/purchasing/checkin': '采购到货单',
|
|
|
|
|
'/purchasing/order': '采购订单',
|
|
|
|
|
'/rd/ebom': '产品BOM',
|
|
|
|
|
'/warehouse/issue': '生产领料单'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function closeMessageBox(page: Page) {
|
|
|
|
|
const closeBtn = page.getByRole('button', { name: /确 定|确定|关 闭|关闭|知道了/ }).first()
|
|
|
|
|
if (await closeBtn.count() > 0) {
|
|
|
|
|
try {
|
|
|
|
|
await closeBtn.click()
|
|
|
|
|
await page.waitForTimeout(300)
|
|
|
|
|
} catch (e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const overlay = page.locator('.el-overlay-message-box')
|
|
|
|
|
if (await overlay.count() > 0) {
|
|
|
|
|
try {
|
|
|
|
|
await page.press('Escape')
|
|
|
|
|
await page.waitForTimeout(300)
|
|
|
|
|
} catch (e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-02 21:44:03 +08:00
|
|
|
export async function login(page: Page) {
|
2026-03-06 02:02:59 +08:00
|
|
|
await page.goto('/')
|
|
|
|
|
await page.waitForLoadState('networkidle')
|
2026-03-02 21:44:03 +08:00
|
|
|
|
2026-03-06 02:02:59 +08:00
|
|
|
const accountInput = page.getByPlaceholder('账号').first()
|
|
|
|
|
|
|
|
|
|
if (!(await accountInput.count())) {
|
|
|
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await accountInput.fill(USERNAME)
|
|
|
|
|
|
|
|
|
|
const passwordInput = page.getByPlaceholder('密码').first()
|
|
|
|
|
if (await passwordInput.count()) {
|
|
|
|
|
await passwordInput.fill(PASSWORD)
|
|
|
|
|
}
|
2026-03-02 21:44:03 +08:00
|
|
|
|
2026-03-06 02:02:59 +08:00
|
|
|
const codeInput = page.getByPlaceholder('验证码').first()
|
|
|
|
|
if (await codeInput.count()) {
|
2026-03-02 21:44:03 +08:00
|
|
|
await codeInput.fill('0000')
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-06 02:02:59 +08:00
|
|
|
await page.getByRole('button', { name: /登 录/ }).click()
|
|
|
|
|
await expect(page).toHaveURL(/\/(dashboard|$)/)
|
|
|
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await closeMessageBox(page)
|
2026-03-02 21:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function clickSubMenu(page: Page, title: string) {
|
2026-03-06 02:02:59 +08:00
|
|
|
await closeMessageBox(page)
|
|
|
|
|
const subMenu = page.locator('.el-sub-menu__title', { hasText: title })
|
|
|
|
|
await subMenu.waitFor({ state: 'visible', timeout: 10000 })
|
|
|
|
|
await subMenu.click()
|
|
|
|
|
await page.waitForTimeout(300)
|
2026-03-02 21:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function clickMenuItem(page: Page, path: string) {
|
2026-03-06 02:02:59 +08:00
|
|
|
await closeMessageBox(page)
|
|
|
|
|
const menuText = PATH_TO_MENU_TEXT[path] || path
|
|
|
|
|
const menuItem = page.locator('.el-menu-item', { hasText: menuText })
|
|
|
|
|
await menuItem.waitFor({ state: 'visible', timeout: 10000 })
|
|
|
|
|
await menuItem.click()
|
|
|
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
|
await page.waitForTimeout(500)
|
|
|
|
|
await closeMessageBox(page)
|
2026-03-02 21:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function expectBasicList(page: Page) {
|
2026-03-06 02:02:59 +08:00
|
|
|
await closeMessageBox(page)
|
2026-03-02 21:44:03 +08:00
|
|
|
await expect(page.locator('.el-form').first()).toBeVisible()
|
|
|
|
|
await expect(page.locator('.el-table').first()).toBeVisible()
|
|
|
|
|
}
|
|
|
|
|
|