|
|
/**
|
|
|
* CNC管理后台 - 模拟采集模块 Playwright E2E测试
|
|
|
*
|
|
|
* 测试范围(IIS模式,真实后端,模拟器未启动):
|
|
|
* - 侧边栏导航:模拟采集菜单项可见可点击
|
|
|
* - 总览页(/simulator):断连状态UI——未连接提示、按钮禁用
|
|
|
*
|
|
|
* 运行方式:`npx playwright test e2e/simulator.spec.ts --project=chromium`
|
|
|
* 前提:IIS站点已部署最新前后端代码,无需启动CncSimulator
|
|
|
*/
|
|
|
import { test, expect, type Page } from '@playwright/test'
|
|
|
|
|
|
// === 登录辅助函数 ===
|
|
|
// 使用完整URL避免baseURL(127.0.0.1)与IIS绑定(192.168.1.202)不匹配
|
|
|
const BASE = 'http://192.168.1.202/admin'
|
|
|
|
|
|
async function login(page: Page) {
|
|
|
await page.goto(`${BASE}/login`)
|
|
|
await page.waitForLoadState('networkidle')
|
|
|
await page.waitForSelector('input', { timeout: 10000 })
|
|
|
const inputs = page.locator('input')
|
|
|
await inputs.nth(0).fill('admin')
|
|
|
await inputs.nth(1).fill('admin123')
|
|
|
await page.locator('button').last().click()
|
|
|
await page.waitForURL(/\/(dashboard|admin\/?$)/, { timeout: 15000 })
|
|
|
}
|
|
|
|
|
|
// ============================================================
|
|
|
// 套件1:侧边栏导航
|
|
|
// ============================================================
|
|
|
test.describe('模拟采集侧边栏导航', () => {
|
|
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
await login(page)
|
|
|
})
|
|
|
|
|
|
test('侧边栏有"模拟采集"菜单项', async ({ page }) => {
|
|
|
const menuItems = page.locator('.el-menu-item')
|
|
|
const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
|
|
|
await expect(simulatorItem).toBeVisible()
|
|
|
})
|
|
|
|
|
|
test('点击"模拟采集"菜单跳转到总览页', async ({ page }) => {
|
|
|
const menuItems = page.locator('.el-menu-item')
|
|
|
const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
|
|
|
await simulatorItem.click()
|
|
|
await page.waitForURL(/\/simulator$/, { timeout: 10000 })
|
|
|
expect(page.url()).toContain('/simulator')
|
|
|
})
|
|
|
})
|
|
|
|
|
|
// ============================================================
|
|
|
// 套件2:总览页——模拟器未连接状态
|
|
|
// ============================================================
|
|
|
test.describe('模拟采集总览页(模拟器未连接)', () => {
|
|
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
await login(page)
|
|
|
// 通过侧边栏菜单导航到模拟采集页面
|
|
|
const menuItems = page.locator('.el-menu-item')
|
|
|
const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
|
|
|
await simulatorItem.click()
|
|
|
await page.waitForURL(/\/simulator$/, { timeout: 10000 })
|
|
|
// 等待ping API调用完成
|
|
|
await page.waitForTimeout(2000)
|
|
|
})
|
|
|
|
|
|
test('页面显示"模拟器未连接"', async ({ page }) => {
|
|
|
await expect(page.locator('text=模拟器未连接')).toBeVisible()
|
|
|
})
|
|
|
|
|
|
test('页面显示友好提示信息', async ({ page }) => {
|
|
|
await expect(page.locator('text=模拟器未启动')).toBeVisible()
|
|
|
})
|
|
|
|
|
|
test('三个操作按钮正确禁用', async ({ page }) => {
|
|
|
await expect(page.locator('button:has-text("全部启动")')).toBeDisabled()
|
|
|
await expect(page.locator('button:has-text("全部停止")')).toBeDisabled()
|
|
|
await expect(page.locator('button:has-text("刷新配置")')).toBeDisabled()
|
|
|
})
|
|
|
|
|
|
test('面包屑导航显示"首页 / 模拟采集"', async ({ page }) => {
|
|
|
const breadcrumb = page.locator('.el-breadcrumb')
|
|
|
await expect(breadcrumb).toBeVisible()
|
|
|
await expect(breadcrumb.locator('text=首页')).toBeVisible()
|
|
|
await expect(breadcrumb.locator('text=模拟采集')).toBeVisible()
|
|
|
})
|
|
|
|
|
|
test('页面无JavaScript异常(排除预期的网络错误)', async ({ page }) => {
|
|
|
const errors: string[] = []
|
|
|
page.on('console', (msg) => {
|
|
|
if (msg.type() === 'error') errors.push(msg.text())
|
|
|
})
|
|
|
await page.reload({ waitUntil: 'networkidle' })
|
|
|
await page.waitForTimeout(3000)
|
|
|
// 过滤掉模拟器不可达的预期错误
|
|
|
const realErrors = errors.filter(e =>
|
|
|
!e.includes('simulator') &&
|
|
|
!e.includes('50001') &&
|
|
|
!e.includes('Network Error') &&
|
|
|
!e.includes('ERR_CONNECTION_REFUSED') &&
|
|
|
!e.includes('404')
|
|
|
)
|
|
|
expect(realErrors).toEqual([])
|
|
|
})
|
|
|
})
|