From 53a0cf020abc7c9a7cfe2e0ba7a87a5f152c94b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B3=E5=90=9B=E5=81=A5?= <40288193@qq.com> Date: Wed, 6 Dec 2023 16:26:52 +0800 Subject: [PATCH] docs(e2e): [tree ,transfer] Add tree /transfer e2e tests (#986) * docs(e2e): Add tree /transfer e2e tests * docs(e2e): fix nested-tree.spec.ts * docs(tree): add tree e2e test * docs(tree): add e2e --- .../demos/pc/app/tooltip/content.spec.js | 2 +- .../pc/app/tooltip/custom-popper.spec.js | 8 +- .../demos/pc/app/transfer/basic-usage.spec.ts | 27 ++-- .../demos/pc/app/transfer/custom-btns.spec.ts | 30 ++--- .../pc/app/transfer/custom-filter.spec.ts | 10 +- .../pc/app/transfer/custom-footer.spec.ts | 3 +- .../pc/app/transfer/custom-render.spec.ts | 12 +- .../pc/app/transfer/custom-titles.spec.ts | 8 +- .../pc/app/transfer/default-checked.spec.ts | 14 +-- .../demos/pc/app/transfer/drop-config.spec.ts | 37 +++--- .../app/transfer/manual-clear-query.spec.ts | 4 +- .../pc/app/transfer/nested-table.spec.ts | 47 ++----- .../demos/pc/app/transfer/nested-tree.spec.ts | 33 +---- .../pc/app/transfer/target-order.spec.ts | 3 +- .../pc/app/transfer/transfer-events.spec.ts | 3 +- .../demos/pc/app/tree/basic-usage.spec.ts | 42 ++++--- .../sites/demos/pc/app/tree/check-op.spec.ts | 54 +++++--- .../sites/demos/pc/app/tree/checkbox.spec.ts | 41 +++--- .../demos/pc/app/tree/contextmenu.spec.ts | 17 +-- examples/sites/demos/pc/app/tree/drag.spec.ts | 28 ++--- examples/sites/demos/pc/app/tree/edit.spec.ts | 119 +++--------------- .../demos/pc/app/tree/expand-control.spec.ts | 40 +++--- .../demos/pc/app/tree/filter-view.spec.ts | 34 +++-- .../sites/demos/pc/app/tree/icons.spec.ts | 38 +++--- examples/sites/demos/pc/app/tree/lazy.spec.ts | 28 ++--- .../sites/demos/pc/app/tree/node-hl.spec.ts | 45 ++++--- .../pc/app/tree/node-op-composition-api.vue | 18 ++- .../sites/demos/pc/app/tree/node-op.spec.ts | 49 +++++--- .../sites/demos/pc/app/tree/other.spec.ts | 23 +--- .../sites/demos/pc/app/tree/props.spec.ts | 25 ++-- .../sites/demos/pc/app/tree/radio.spec.ts | 28 ++--- examples/sites/demos/pc/app/tree/slot.spec.ts | 30 ++--- 32 files changed, 385 insertions(+), 515 deletions(-) diff --git a/examples/sites/demos/pc/app/tooltip/content.spec.js b/examples/sites/demos/pc/app/tooltip/content.spec.js index 6e45e31b0..5d4a9aeca 100644 --- a/examples/sites/demos/pc/app/tooltip/content.spec.js +++ b/examples/sites/demos/pc/app/tooltip/content.spec.js @@ -5,7 +5,7 @@ test('测试插槽', async ({ page }) => { await page.goto('tooltip#content') const button2 = page.getByRole('button', { name: '校验错误' }) - const tooltip2 = page.getByText('该网段不可用!可用网段:163') + const tooltip2 = page.getByText('该网段不可用') await button2.hover() await expect(tooltip2).toBeVisible() diff --git a/examples/sites/demos/pc/app/tooltip/custom-popper.spec.js b/examples/sites/demos/pc/app/tooltip/custom-popper.spec.js index 3ed7aac71..c8bf2aa75 100644 --- a/examples/sites/demos/pc/app/tooltip/custom-popper.spec.js +++ b/examples/sites/demos/pc/app/tooltip/custom-popper.spec.js @@ -2,12 +2,12 @@ import { test, expect } from '@playwright/test' test('测试是否显示箭头', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tooltip#visible-arrow') + await page.goto('tooltip#custom-popper') - const button = page.getByRole('button', { name: '不显示 Tooltip 箭头' }) - const tip = page.getByRole('tooltip', { name: '不显示 Tooltip 箭头', includeHidden: true }) + const button = page.getByRole('button', { name: '鼠标悬浮在这里' }) + const tip = page.getByText('我是提示内容') const arrow = tip.locator('div.popper__arrow') await button.hover() - await expect(arrow).toHaveCount(0) + await expect(arrow).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/transfer/basic-usage.spec.ts b/examples/sites/demos/pc/app/transfer/basic-usage.spec.ts index c5e8cf3c1..88857c3a4 100644 --- a/examples/sites/demos/pc/app/transfer/basic-usage.spec.ts +++ b/examples/sites/demos/pc/app/transfer/basic-usage.spec.ts @@ -1,20 +1,9 @@ import { test, expect } from '@playwright/test' -test('默认状态下交换按钮是否禁用', async ({ page }) => { +test('基本用法', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#basic-usage') - const preview = page.locator('#preview') - const buttons = preview.getByRole('button') - // 向左交换按钮应该为禁用状态 - await expect(buttons.first()).toBeDisabled() - // 向右交换按钮应该为禁用状态 - await expect(buttons.nth(1)).toBeDisabled() -}) - -test('多选', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#basic-usage') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') // 穿梭框按钮 const buttons = preview.getByRole('button') // 穿梭框面板 @@ -24,6 +13,11 @@ test('多选', async ({ page }) => { // 右侧面板 const rightPanel = transferPanels.nth(1) + // 向左交换按钮应该为禁用状态 + await expect(buttons.first()).toBeDisabled() + // 向右交换按钮应该为禁用状态 + await expect(buttons.nth(1)).toBeDisabled() + // 从左侧面板选择多个备用项,交换至右侧面板 let labels = leftPanel.locator('label').filter({ hasText: '备选项 2' }).locator('span') // 选中"备选项2" @@ -89,14 +83,7 @@ test('多选', async ({ page }) => { await expect(buttons.first()).toBeDisabled() // 向右侧交换的按钮应该为不可用状态 await expect(buttons.nth(1)).toBeDisabled() -}) -test('全选', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#basic-usage') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() // 全选 await leftPanel.locator('.tiny-checkbox__input').first().click() // 显示的选中数量应该为 11 diff --git a/examples/sites/demos/pc/app/transfer/custom-btns.spec.ts b/examples/sites/demos/pc/app/transfer/custom-btns.spec.ts index 5db8020b6..8f30a69ab 100644 --- a/examples/sites/demos/pc/app/transfer/custom-btns.spec.ts +++ b/examples/sites/demos/pc/app/transfer/custom-btns.spec.ts @@ -1,34 +1,26 @@ import { test, expect } from '@playwright/test' -test('判断按钮是否可用', async ({ page }) => { +test('自定义按钮测试', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#show-all-btn') - const preview = page.locator('#preview') - const buttons = preview.getByRole('button') - await expect(buttons.first()).toBeEnabled() - await expect(buttons.nth(3)).toBeEnabled() -}) + await page.goto('transfer#custom-btns') -test('全部移动到右侧', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#show-all-btn') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container .tiny-transfer') const buttons = preview.getByRole('button') const transferPanels = preview.locator('.tiny-transfer-panel') + const leftPanel = transferPanels.first() const rightPanel = transferPanels.nth(1) + + // 判断按钮是否可用 + await expect(buttons.first()).toBeEnabled() + await expect(buttons.nth(3)).toBeEnabled() + + //全部移动到右侧 await buttons.first().click() await expect(rightPanel.locator('label').filter({ hasText: '列表 2 0 / 13' })).toHaveCount(1) await expect(buttons.first()).toBeDisabled() await expect(buttons.nth(3)).toBeEnabled() -}) -test('全部移动到左侧', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#show-all-btn') - const preview = page.locator('#preview') - const buttons = preview.getByRole('button') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() + // 全部移动到左侧 await buttons.nth(3).click() await expect(leftPanel.locator('label').filter({ hasText: '列表 1 0 / 15' })).toHaveCount(1) await expect(buttons.first()).toBeEnabled() diff --git a/examples/sites/demos/pc/app/transfer/custom-filter.spec.ts b/examples/sites/demos/pc/app/transfer/custom-filter.spec.ts index 04a7a51fd..3f8151828 100644 --- a/examples/sites/demos/pc/app/transfer/custom-filter.spec.ts +++ b/examples/sites/demos/pc/app/transfer/custom-filter.spec.ts @@ -2,14 +2,16 @@ import { test, expect } from '@playwright/test' test('自定义过滤方法', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#custom-filter-method') - const preview = page.locator('#preview') + await page.goto('transfer#custom-filter') + + const preview = page.locator('.pc-demo-container') const transferPanels = preview.locator('div.tiny-transfer-panel') const leftPanel = transferPanels.first() - const input = preview.getByPlaceholder('请输入城市拼音').first() + const input = preview.getByPlaceholder('请输入城市拼音').first().locator('input') + const items = leftPanel.locator('div.tiny-transfer-panel__list > label') + await input.click() await input.fill('xi') - const items = leftPanel.locator('div.tiny-transfer-panel__list > label') await expect(items).toHaveCount(1) // 判断删除搜索关键字后是否正常显示列表 await input.click() diff --git a/examples/sites/demos/pc/app/transfer/custom-footer.spec.ts b/examples/sites/demos/pc/app/transfer/custom-footer.spec.ts index 05ea2813c..b6c9a392f 100644 --- a/examples/sites/demos/pc/app/transfer/custom-footer.spec.ts +++ b/examples/sites/demos/pc/app/transfer/custom-footer.spec.ts @@ -3,6 +3,5 @@ import { test, expect } from '@playwright/test' test('自定义列表底部', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#custom-footer') - await page.getByRole('button', { name: '操作' }).first().click() - await page.getByRole('button', { name: '操作' }).nth(1).click() + await expect(page.getByRole('button', { name: '操作' })).toHaveCount(2) }) diff --git a/examples/sites/demos/pc/app/transfer/custom-render.spec.ts b/examples/sites/demos/pc/app/transfer/custom-render.spec.ts index b88a79260..0f2a791bf 100644 --- a/examples/sites/demos/pc/app/transfer/custom-render.spec.ts +++ b/examples/sites/demos/pc/app/transfer/custom-render.spec.ts @@ -2,9 +2,11 @@ import { test, expect } from '@playwright/test' test('判断是否可以选中自定义数据项', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#custom-render-content') - await page.locator('label').filter({ hasText: '2 - 备选项 2' }).locator('span').nth(1).click() - await expect(page.locator('label').filter({ hasText: '2 - 备选项 2' }).locator('span').first()).toHaveClass( - /is-checked/ - ) + await page.goto('transfer#custom-render') + + const preview = page.locator('.pc-demo-container') + const jsxNode = preview.getByText('备选项 2 -by jsx') + const slotNode = preview.getByText('备选项 2 - by slot') + await expect(jsxNode).toHaveCount(1) + await expect(slotNode).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/transfer/custom-titles.spec.ts b/examples/sites/demos/pc/app/transfer/custom-titles.spec.ts index 36a4f460a..84fa68c4e 100644 --- a/examples/sites/demos/pc/app/transfer/custom-titles.spec.ts +++ b/examples/sites/demos/pc/app/transfer/custom-titles.spec.ts @@ -2,11 +2,13 @@ import { test, expect } from '@playwright/test' test('自定义列表标题', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#custom-transfer-titles') - const preview = page.locator('#preview') + await page.goto('transfer#custom-titles') + const preview = page.locator('.pc-demo-container') + const transferPanels = preview.locator('.tiny-transfer-panel') const leftPanel = transferPanels.first() - await expect(leftPanel.locator('.tiny-checkbox__label').first()).toHaveText(/所有数据列表/) const rightPanel = transferPanels.nth(1) + + await expect(leftPanel.locator('.tiny-checkbox__label').first()).toHaveText(/所有数据列表/) await expect(rightPanel.locator('.tiny-checkbox__label').first()).toHaveText(/已选数据列表/) }) diff --git a/examples/sites/demos/pc/app/transfer/default-checked.spec.ts b/examples/sites/demos/pc/app/transfer/default-checked.spec.ts index 9baac332c..149540245 100644 --- a/examples/sites/demos/pc/app/transfer/default-checked.spec.ts +++ b/examples/sites/demos/pc/app/transfer/default-checked.spec.ts @@ -1,22 +1,18 @@ import { test, expect } from '@playwright/test' -test('判断左侧面板是否有默认勾选项', async ({ page }) => { +test('判断面板是否有默认勾选项', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#default-checked') - const preview = page.locator('#preview') + + const preview = page.locator('.pc-demo-container') const transferPanels = preview.locator('.tiny-transfer-panel') const leftPanel = transferPanels.first() + const rightPanel = transferPanels.nth(1) + await expect(leftPanel.locator('label').filter({ hasText: '备选项 2' }).first()).toHaveClass(/is-checked/) await expect(leftPanel.locator('label').filter({ hasText: '备选项 6' }).first()).toHaveClass(/is-checked/) await expect(preview.getByRole('button').first()).toBeEnabled() -}) -test('判断右侧面板是否有默认勾选项', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#default-checked') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const rightPanel = transferPanels.nth(1) await expect(rightPanel.locator('label').filter({ hasText: '备选项 1' }).first()).toHaveClass(/is-checked/) await expect(preview.getByRole('button').nth(1)).toBeEnabled() }) diff --git a/examples/sites/demos/pc/app/transfer/drop-config.spec.ts b/examples/sites/demos/pc/app/transfer/drop-config.spec.ts index 1635f02cc..a9d89aef1 100644 --- a/examples/sites/demos/pc/app/transfer/drop-config.spec.ts +++ b/examples/sites/demos/pc/app/transfer/drop-config.spec.ts @@ -1,33 +1,38 @@ import { test, expect } from '@playwright/test' -test('尝试拖拽左侧某一项至右侧面板', async ({ page }) => { +test('尝试拖拽', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#drop-config') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') const transferPanels = preview.locator('.tiny-transfer-panel') const leftPanel = transferPanels.first() const rightPanel = transferPanels.nth(1) - const dragDiv = leftPanel.locator('label:nth-child(2)').first() - await dragDiv.hover() + const dragDiv1 = leftPanel.locator('label:nth-child(2)').first() + + // 尝试拖拽左侧某一项至右侧面板 + await page.waitForTimeout(100) + await dragDiv1.hover() + await page.waitForTimeout(100) await page.mouse.down() + await page.waitForTimeout(100) await rightPanel.hover() + await page.waitForTimeout(100) await page.mouse.up() + await page.waitForTimeout(100) await expect(rightPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 2 0 / 5' })).toHaveCount(1) await expect(leftPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 1 0 / 11' })).toHaveCount(1) -}) -test('尝试拖拽右侧某一项至左侧面板', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#drop-config') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() - const rightPanel = transferPanels.nth(1) - const dragDiv = rightPanel.locator('label').filter({ hasText: '备选项 3' }) - await dragDiv.hover() + //尝试拖拽右侧某一项至左侧面板 + const dragDiv2 = rightPanel.locator('label').filter({ hasText: '备选项 3' }) + await page.waitForTimeout(100) + await dragDiv2.hover() + await page.waitForTimeout(100) await page.mouse.down() + await page.waitForTimeout(100) await leftPanel.hover() + await page.waitForTimeout(100) await page.mouse.up() - await expect(leftPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 1 0 / 13' })).toHaveCount(1) - await expect(rightPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 2 0 / 3' })).toHaveCount(1) + await page.waitForTimeout(100) + await expect(leftPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 1 0 / 12' })).toHaveCount(1) + await expect(rightPanel.locator('.tiny-transfer-panel__header').filter({ hasText: '列表 2 0 / 4' })).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/transfer/manual-clear-query.spec.ts b/examples/sites/demos/pc/app/transfer/manual-clear-query.spec.ts index e72d891aa..1481fa6fd 100644 --- a/examples/sites/demos/pc/app/transfer/manual-clear-query.spec.ts +++ b/examples/sites/demos/pc/app/transfer/manual-clear-query.spec.ts @@ -3,8 +3,8 @@ import { test, expect } from '@playwright/test' test('判断是否可以清除搜索内容', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#manual-clear-query') - const preview = page.locator('#preview') - const input = preview.getByPlaceholder('请输入搜索内容').first() + const preview = page.locator('.pc-demo-container') + const input = preview.locator('.tiny-input-display-only input').first() await input.click() await input.fill('1') await preview.getByRole('button', { name: '重置查询' }).click() diff --git a/examples/sites/demos/pc/app/transfer/nested-table.spec.ts b/examples/sites/demos/pc/app/transfer/nested-table.spec.ts index ed75cc168..3f5925343 100644 --- a/examples/sites/demos/pc/app/transfer/nested-table.spec.ts +++ b/examples/sites/demos/pc/app/transfer/nested-table.spec.ts @@ -1,48 +1,25 @@ import { test, expect } from '@playwright/test' -test('判断是否可以将左侧数据交换到右侧面板', async ({ page }) => { +test('判断数据交换', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#nested-table') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') const transferPanels = preview.locator('.tiny-transfer-panel') + const leftPanel = transferPanels.first() const rightPanel = transferPanels.nth(1) - await preview.locator('.tiny-button').first().click() + const toRightBtn = preview.locator('.tiny-button').first() + + // 判断是否可以将左侧数据交换到右侧面板 + await toRightBtn.click() await expect(rightPanel.getByText('列表 2 1 / 8')).toHaveCount(1) -}) + await page.waitForTimeout(50) -test('判断是否可以将右侧数据交换到左侧面板', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#nested-table') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() + //判断是否可以将右侧数据交换到左侧面板 await preview.locator('.defaultButton > button:nth-child(2)').click() - await expect(leftPanel.getByText('列表 1 1 / 14')).toHaveCount(1) -}) + await expect(leftPanel.getByText('列表 1 0 / 13')).toHaveCount(1) + await page.waitForTimeout(50) -test('判断是否可以切换分页页码', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#nested-table') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() + // 判断是否可以切换分页页码 await preview.getByRole('listitem').filter({ hasText: '2' }).click() await expect(leftPanel.getByRole('table').locator('tbody > tr')).toHaveCount(3) }) - -test('判断搜索功能是否正常', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#nested-table') - const preview = page.locator('#preview') - const transferPanels = preview.locator('.tiny-transfer-panel') - const leftPanel = transferPanels.first() - const input = preview.getByPlaceholder('请输入城市拼音') - await input.first().click() - await input.first().fill('1') - const count = leftPanel.getByRole('table').locator('tbody > tr') - await expect(count).toHaveCount(7) - // 清空搜索内容 - await input.first().click() - await input.first().fill('') - await expect(count).toHaveCount(10) -}) diff --git a/examples/sites/demos/pc/app/transfer/nested-tree.spec.ts b/examples/sites/demos/pc/app/transfer/nested-tree.spec.ts index 95647cc30..08cab4a54 100644 --- a/examples/sites/demos/pc/app/transfer/nested-tree.spec.ts +++ b/examples/sites/demos/pc/app/transfer/nested-tree.spec.ts @@ -1,39 +1,12 @@ import { test, expect } from '@playwright/test' -test('判断是否可以将左侧数据交换至右侧面板', async ({ page }) => { +test('嵌套树', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#nested-tree') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') await preview.getByRole('treeitem', { name: '一级 1' }).locator('svg').first().click() await preview.getByRole('treeitem', { name: '一级 1' }).getByText('二级 1-1').click() await preview.getByRole('treeitem', { name: '三级 1-1-1' }).locator('span').nth(2).click() - await preview.getByRole('button').first().click() - const transferPanels = preview.locator('.tiny-transfer-panel') - const rightPanel = transferPanels.nth(1) - await expect( - rightPanel.locator( - 'div:nth-child(3) > div:nth-child(4) > .tiny-tree-node > .tiny-tree-node__content > span.tiny-tree-node__label' - ) - ).toHaveText('三级 1-1-1') -}) -test('置顶和置底功能', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('transfer#nested-tree') - const preview = page.locator('#preview') - const buttons = await preview.getByRole('paragraph').filter({ hasText: '列表 2 1 / 3' }).locator('div') - await buttons.nth(1).click() - const transferPanels = preview.locator('.tiny-transfer-panel') - const rightPanel = transferPanels.nth(1) - await expect( - rightPanel.locator( - 'div:nth-child(3) > div:nth-child(1) > .tiny-tree-node > .tiny-tree-node__content > span.tiny-tree-node__label' - ) - ).toHaveText('二级 2-1') - await buttons.nth(2).click() - await expect( - rightPanel.locator( - 'div:nth-child(3) > div:nth-child(3) > .tiny-tree-node > .tiny-tree-node__content > span.tiny-tree-node__label' - ) - ).toHaveText('二级 2-1') + await expect(preview.getByText('三级 1-1-1')).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/transfer/target-order.spec.ts b/examples/sites/demos/pc/app/transfer/target-order.spec.ts index dd92bf314..ec38e8bfa 100644 --- a/examples/sites/demos/pc/app/transfer/target-order.spec.ts +++ b/examples/sites/demos/pc/app/transfer/target-order.spec.ts @@ -3,12 +3,13 @@ import { test, expect } from '@playwright/test' test('判断交换左侧备选项后是否位于右侧面板首位', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#target-order') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') const buttons = preview.getByRole('button') const transferPanels = preview.locator('.tiny-transfer-panel') const leftPanel = transferPanels.first() await leftPanel.locator('label').filter({ hasText: '备选项 2' }).click() await buttons.first().click() + const rightPanel = transferPanels.nth(1) await expect(rightPanel.locator('label').filter({ hasText: '备选项 2' })).toHaveCount(1) await leftPanel.locator('label').filter({ hasText: '备选项 3' }).click() diff --git a/examples/sites/demos/pc/app/transfer/transfer-events.spec.ts b/examples/sites/demos/pc/app/transfer/transfer-events.spec.ts index eaea1defd..e61853296 100644 --- a/examples/sites/demos/pc/app/transfer/transfer-events.spec.ts +++ b/examples/sites/demos/pc/app/transfer/transfer-events.spec.ts @@ -3,13 +3,14 @@ import { test, expect } from '@playwright/test' test('判断是否触发了不同事件', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('transfer#transfer-events') - const preview = page.locator('#preview') + const preview = page.locator('.pc-demo-container') const transferPanels = preview.locator('.tiny-transfer-panel') const leftPanel = transferPanels.first() await leftPanel.locator('label').filter({ hasText: '备选项 2' }).click() await expect(page.getByText(/^left-check-change 事件/)).toBeVisible() await preview.getByRole('button').first().click() await expect(page.getByText(/^change 事件/)).toBeVisible() + const rightPanel = transferPanels.nth(1) await rightPanel.locator('label').first().click() await expect(page.getByText(/^right-check-change 事件/)).toBeVisible() diff --git a/examples/sites/demos/pc/app/tree/basic-usage.spec.ts b/examples/sites/demos/pc/app/tree/basic-usage.spec.ts index 4f0eb05f9..c2a8afced 100644 --- a/examples/sites/demos/pc/app/tree/basic-usage.spec.ts +++ b/examples/sites/demos/pc/app/tree/basic-usage.spec.ts @@ -4,20 +4,30 @@ test('tree组件基本使用', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('tree#basic-usage') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree') + const showLineBtn = preview.locator('.tiny-radio').nth(0) + const miniBtn = preview.locator('.tiny-radio').nth(2) + const offsetBtn = preview.locator('.tiny-radio').nth(6) + const indentSpan = preview.locator('.tiny-tree-node__content-indent').nth(1) + + // 测试渲染出数据 + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + + // 测试连接线 有连线时,show-line + await showLineBtn.click() + await page.waitForTimeout(20) + expect(await tree.locator('.show-line').count()).toBeGreaterThan(1) + + // 测试字体 + await expect(tree.getByText('数据 1-1-1')).toHaveCSS('font-size', '14px') + await miniBtn.click() + await page.waitForTimeout(20) + await expect(tree.getByText('数据 1-1-1')).toHaveCSS('font-size', '12px') + + // 测试偏移 18px + 8 padding + await expect(indentSpan).toHaveCSS('width', '26px') + await offsetBtn.click() + await page.waitForTimeout(20) + await expect(indentSpan).toHaveCSS('width', '46px') }) diff --git a/examples/sites/demos/pc/app/tree/check-op.spec.ts b/examples/sites/demos/pc/app/tree/check-op.spec.ts index 4f0eb05f9..63fd10908 100644 --- a/examples/sites/demos/pc/app/tree/check-op.spec.ts +++ b/examples/sites/demos/pc/app/tree/check-op.spec.ts @@ -1,23 +1,41 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('多选的勾选 ', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#check-op') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const treeChecked = tree.locator('label.is-checked') + const btn1 = preview.getByText('查询勾选状态') + const btn2 = preview.getByText('清除全部勾选') + const btn3 = preview.getByText('根据节点数据勾选') + const btn4 = preview.getByText('根据node-key勾选') + const btn5 = preview.getByText('根据node-key,多值勾选') + const btn6 = preview.getByText('根据node,多值勾选') + + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + await expect(treeChecked).toHaveCount(0) + + await btn3.click() + await expect(treeChecked).toHaveCount(4) + await page.waitForTimeout(20) + + await btn4.click() + await expect(treeChecked).toHaveCount(1) + await page.waitForTimeout(20) + + await btn5.click() + await expect(treeChecked).toHaveCount(6) + await page.waitForTimeout(20) + + await btn6.click() + await expect(treeChecked).toHaveCount(3) + await page.waitForTimeout(20) + + await btn2.click() + await expect(treeChecked).toHaveCount(0) + await page.waitForTimeout(20) + + await btn1.click() }) diff --git a/examples/sites/demos/pc/app/tree/checkbox.spec.ts b/examples/sites/demos/pc/app/tree/checkbox.spec.ts index 4f0eb05f9..fbc62d788 100644 --- a/examples/sites/demos/pc/app/tree/checkbox.spec.ts +++ b/examples/sites/demos/pc/app/tree/checkbox.spec.ts @@ -1,23 +1,28 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('多选功能', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#checkbox') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree1 = preview.locator('.tiny-tree').nth(0) + const tree2 = preview.locator('.tiny-tree').nth(1) + + const tree1Checked = tree1.locator('label.is-checked') + const tree2Checked = tree2.locator('label.is-checked') + + await expect(tree1.getByText('数据 1-1-1')).toHaveCount(1) + await page.waitForTimeout(50) + + // 测试左树 + await expect(tree1Checked).toHaveCount(3) + await tree1.getByText('数据 3').nth(0).click() + await page.waitForTimeout(50) + await expect(tree1Checked).toHaveCount(5) + + // 测试右树 + await expect(tree2Checked).toHaveCount(1) + await tree2.locator('.tiny-checkbox__inner').nth(5).click() + await page.waitForTimeout(50) + await expect(tree2Checked).toHaveCount(2) }) diff --git a/examples/sites/demos/pc/app/tree/contextmenu.spec.ts b/examples/sites/demos/pc/app/tree/contextmenu.spec.ts index 678ed6683..b809d2bc0 100644 --- a/examples/sites/demos/pc/app/tree/contextmenu.spec.ts +++ b/examples/sites/demos/pc/app/tree/contextmenu.spec.ts @@ -1,14 +1,15 @@ import { test, expect } from '@playwright/test' -test('可自定义右键菜单内容', async ({ page }) => { +test('右键菜单', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('tree#contextmenu') - await page.getByText('三级 1-1-1').first().click({ - button: 'right' - }) - const menu = page.locator('#preview .tiny-tree-node__menu') - await expect(menu).toBeVisible() - await page.locator('.context-menu li').first().click() - await expect(menu).not.toBeVisible() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const node = tree.getByText('数据 1-1-1') + await expect(node).toHaveCount(1) + + await node.click({ button: 'right' }) + await page.waitForTimeout(20) + await expect(tree.getByText('更新')).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/tree/drag.spec.ts b/examples/sites/demos/pc/app/tree/drag.spec.ts index 4f0eb05f9..0c7a06f80 100644 --- a/examples/sites/demos/pc/app/tree/drag.spec.ts +++ b/examples/sites/demos/pc/app/tree/drag.spec.ts @@ -1,23 +1,15 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('右键菜单', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#drag') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + + await tree.getByText('数据 2-1').dragTo(tree.getByText('数据 1-1-1')) + await page.waitForTimeout(100) + await tree.getByText('数据 1-1-1').dragTo(tree.getByText('数据 2-2')) + await page.waitForTimeout(100) }) diff --git a/examples/sites/demos/pc/app/tree/edit.spec.ts b/examples/sites/demos/pc/app/tree/edit.spec.ts index e28cba5dd..0ef473df4 100644 --- a/examples/sites/demos/pc/app/tree/edit.spec.ts +++ b/examples/sites/demos/pc/app/tree/edit.spec.ts @@ -1,106 +1,27 @@ import { test, expect } from '@playwright/test' -test.describe('节点编辑', () => { - test('编辑节点内容', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#edit') +test('编辑', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('tree#edit') - const tree = page.locator('#preview .tiny-tree') - const node = tree.locator('.tiny-tree-node').first() - const nodeLeft = node.locator('.tiny-tree-node__content-left').first() - const nodeRight = node.locator('.tiny-tree-node__content-right').first() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const btn1 = preview.getByText('进入编辑') + const btn2 = preview.getByText('取消编辑') + const btn3 = preview.getByText('新建子节点') + const editIcons = tree.locator('[title="编辑"]') + const input = tree.locator('.tiny-input input') - await page.getByRole('button', { name: '进入编辑' }).click() - await expect(nodeRight.getByTitle('编辑')).toBeVisible() - await nodeRight.getByTitle('编辑').click() - await expect(nodeLeft.locator('.tiny-input')).toBeVisible() - await expect(nodeLeft.locator('.tiny-input input')).toHaveValue('一级 1') - await nodeLeft.locator('.tiny-input input').fill('aaa') - await nodeLeft.locator('.tiny-input input').blur() - await expect(node.locator('.tiny-tree-node__label').first()).toHaveText('aaa') - }) + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + await btn1.click() + await expect(editIcons).toHaveCount(8) + await page.waitForTimeout(20) - test('进入编辑状态后删除节点', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#edit') + await btn2.click() + await expect(editIcons).toHaveCount(0) + await page.waitForTimeout(20) - const tree = page.locator('#preview .tiny-tree') - const node = tree.locator('.tiny-tree-node').first() - const delBtn = node.locator('.tiny-tree-node__content-right > span:nth-child(2) > .tiny-svg').first() - const delPopover = page.locator('.tiny-tree__del-popover').nth(1) - await page.getByRole('button', { name: '进入编辑' }).click() - await delBtn.click() - await expect(delPopover).toBeVisible() - - // 连同子孙节点一起删除 - await delPopover.getByRole('button', { name: '确定' }).click() - await expect(node).not.toContainText('一级 1') - await expect(tree.locator('.tiny-tree-node')).toHaveCount(2) - - // 保留子孙节点 - await delBtn.click() - await delPopover.locator('.tiny-checkbox').click() - await delPopover.getByRole('button', { name: '确定' }).click() - await expect(node.locator('.tiny-tree-node__label')).toHaveText('一级 3') - await expect(tree.locator('.tiny-tree-node')).toHaveCount(3) - }) - - test('进入编辑状态后新增子节点', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#edit') - - const tree = page.locator('#preview .tiny-tree') - const nodes = tree.locator('.tiny-tree-node') - const node = nodes.first() - const newNode = nodes.filter({ hasText: 'aaa' }).first() - - await page.getByRole('button', { name: '进入编辑' }).click() - await node.getByTitle('新增下级').first().click() - await node.getByRole('textbox').fill('aaa') - await node.getByRole('textbox').blur() - await expect(newNode).toBeVisible() - }) - - test('取消编辑', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#edit') - - const tree = page.locator('#preview .tiny-tree') - const nodes = tree.locator('.tiny-tree-node') - const node = nodes.first() - const delBtn = node.locator('.tiny-tree-node__content-right > span:nth-child(2) > .tiny-svg').first() - const delPopover = page.locator('.tiny-tree__del-popover').nth(1) - - await expect(nodes).toHaveCount(6) - - // 删除一些节点 - await page.getByRole('button', { name: '进入编辑' }).click() - await delBtn.click() - await delPopover.getByRole('button', { name: '确定' }).click() - await expect(nodes).toHaveCount(2) - - // 取消编辑后已删除节点重新恢复 - await page.getByRole('button', { name: '取消编辑' }).click() - await expect(nodes).toHaveCount(6) - }) - - test('保存编辑', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#edit') - - const tree = page.locator('#preview .tiny-tree') - const node = tree.locator('.tiny-tree-node').first() - const nodeLeft = node.locator('.tiny-tree-node__content-left').first() - const nodeRight = node.locator('.tiny-tree-node__content-right').first() - - // 编辑节点内容 - await page.getByRole('button', { name: '进入编辑' }).click() - await nodeRight.getByTitle('编辑').click() - await nodeLeft.locator('.tiny-input input').fill('aaa') - await nodeLeft.locator('.tiny-input input').blur() - - // 保存编辑, 检查是否正确保存 - await page.getByRole('button', { name: '保存编辑' }).click() - await expect(node.locator('.tiny-tree-node__label').first()).toHaveText('aaa') - }) + await btn3.click() + await expect(input).toHaveCount(1) + input.fill('123') }) diff --git a/examples/sites/demos/pc/app/tree/expand-control.spec.ts b/examples/sites/demos/pc/app/tree/expand-control.spec.ts index 4f0eb05f9..e12dfb721 100644 --- a/examples/sites/demos/pc/app/tree/expand-control.spec.ts +++ b/examples/sites/demos/pc/app/tree/expand-control.spec.ts @@ -1,23 +1,27 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('节点的展开', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#expand-control') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree1 = preview.locator('.tiny-tree').nth(0) + const tree2 = preview.locator('.tiny-tree').nth(1) + const allBtn = preview.getByText('切换全部展开收起') + const openBtn = preview.getByText('展开高亮') + const closeBtn = preview.getByText('收起高亮') + + // 测试全部收起 + await expect(tree1.locator('.is-expanded')).toHaveCount(8) // 叶子节点也有这个类 + await allBtn.click() + await expect(tree1.locator('.is-expanded')).toHaveCount(0) + + // 测试收起/展开 + await page.waitForTimeout(50) + await expect(tree2.locator('.is-expanded')).toHaveCount(1) + await closeBtn.click() + await expect(tree2.locator('.is-expanded')).toHaveCount(0) + await page.waitForTimeout(50) + await openBtn.click() + await expect(tree2.locator('.is-expanded')).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/tree/filter-view.spec.ts b/examples/sites/demos/pc/app/tree/filter-view.spec.ts index 4f0eb05f9..6975b9a8c 100644 --- a/examples/sites/demos/pc/app/tree/filter-view.spec.ts +++ b/examples/sites/demos/pc/app/tree/filter-view.spec.ts @@ -1,23 +1,21 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('过滤视图', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#filter-view') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const btnPlain = preview.getByText('平铺视图 plain') + const checkboxs = tree.locator('.tiny-tree__plain-node .tiny-checkbox') + const input = preview.locator('.tiny-input input') + + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + + await btnPlain.click() + await expect(checkboxs).toHaveCount(8) + await page.waitForTimeout(20) + + await input.fill('1-1') + await expect(checkboxs).toHaveCount(3) }) diff --git a/examples/sites/demos/pc/app/tree/icons.spec.ts b/examples/sites/demos/pc/app/tree/icons.spec.ts index 4f0eb05f9..304ce7f12 100644 --- a/examples/sites/demos/pc/app/tree/icons.spec.ts +++ b/examples/sites/demos/pc/app/tree/icons.spec.ts @@ -1,23 +1,25 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('自定义图标', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#icons') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree1 = preview.locator('.tiny-tree').nth(0) + const tree2 = preview.locator('.tiny-tree').nth(1) + + const icon1 = tree1.locator('svg path').nth(0) + const icon2 = tree2.locator('svg path').nth(0) + + // 测试tree1 + await expect(tree1.getByText('数据 2')).toHaveCount(1) + await expect(icon1).toHaveAttribute('d', 'm6 2 13 10L6 22V2zm2 4v12l8-6.1L8 6z') + + // 测试tree2 + await expect(tree2.getByText('数据 2')).toHaveCount(1) + await expect(icon2).toHaveAttribute( + 'd', + 'M13 11h4c.6 0 1 .4 1 1s-.4 1-1 1h-4v4c0 .6-.4 1-1 1s-1-.4-1-1v-4H7c-.6 0-1-.4-1-1s.4-1 1-1h4V7c0-.6.4-1 1-1s1 .4 1 1v4zM3 1h18c.9 0 2 1.1 2 2v18c0 .9-1 2-2 2H3c-.9 0-2-1.1-2-2V3c0-.9 1.1-2 2-2zm0 2v18h18V3H3z' + ) + await expect(icon2).toHaveCSS('fill', 'rgb(255, 0, 0)') }) diff --git a/examples/sites/demos/pc/app/tree/lazy.spec.ts b/examples/sites/demos/pc/app/tree/lazy.spec.ts index 4f0eb05f9..9b62663db 100644 --- a/examples/sites/demos/pc/app/tree/lazy.spec.ts +++ b/examples/sites/demos/pc/app/tree/lazy.spec.ts @@ -1,23 +1,15 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('懒加载', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#lazy') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const node2 = tree.getByText('#数据 2') + + await expect(node2).toHaveCount(1) + await node2.click() + await page.waitForTimeout(20) + await expect(node2).toHaveCount(6) }) diff --git a/examples/sites/demos/pc/app/tree/node-hl.spec.ts b/examples/sites/demos/pc/app/tree/node-hl.spec.ts index 4f0eb05f9..7667b825f 100644 --- a/examples/sites/demos/pc/app/tree/node-hl.spec.ts +++ b/examples/sites/demos/pc/app/tree/node-hl.spec.ts @@ -1,23 +1,32 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('节点选择与高亮', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#node-hl') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree') + const node = tree.getByText('数据 1-1-1') + const currNode = tree.locator('.is-current') + const button = preview.getByText('手动高亮节点') + + await expect(node).toHaveCount(1) + + // 测试点击后,打印事件 + const values = [] as string[] + page.on('console', async (msg) => { + for (const arg of msg.args()) { + values.push(await arg.jsonValue()) + } + }) + await node.click() + await page.waitForTimeout(50) + + expect(values.length).toBe(2) + expect(values[0].startsWith('当前高亮节点')).toBeTruthy() + + // 测试自动点击 + await button.click() + await page.waitForTimeout(50) + await expect(currNode.getByText('数据 2-1')).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/tree/node-op-composition-api.vue b/examples/sites/demos/pc/app/tree/node-op-composition-api.vue index f7bbd0597..8f47dfa05 100644 --- a/examples/sites/demos/pc/app/tree/node-op-composition-api.vue +++ b/examples/sites/demos/pc/app/tree/node-op-composition-api.vue @@ -7,7 +7,13 @@ 更新子节点 删除当前节点 - + @@ -37,29 +43,29 @@ const data = ref([ children: [{ id: '3-1', label: '数据 3-1' }] } ]) - +const currentNodeKey = ref('1-1') function insertBefore() { const currentKey = treeRef.value.getCurrentKey() - treeRef.value.insertBefore({ id: id, label: 'insertBefore ' + id }, currentKey) + treeRef.value.insertBefore({ id, label: 'insertBefore ' + id }, currentKey) id++ } function insertAfter() { const currentKey = treeRef.value.getCurrentKey() - treeRef.value.insertAfter({ id: id, label: 'insertAfter ' + id }, currentKey) + treeRef.value.insertAfter({ id, label: 'insertAfter ' + id }, currentKey) id++ } function append() { const currentKey = treeRef.value.getCurrentKey() - treeRef.value.append({ id: id, label: 'append ' + id }, currentKey) + treeRef.value.append({ id, label: 'append ' + id }, currentKey) id++ } function updateKeyChildren() { const currentKey = treeRef.value.getCurrentKey() - treeRef.value.updateKeyChildren(currentKey, [{ id: id, label: 'update ' + id }]) + treeRef.value.updateKeyChildren(currentKey, [{ id, label: 'update ' + id }]) id++ } function remove() { diff --git a/examples/sites/demos/pc/app/tree/node-op.spec.ts b/examples/sites/demos/pc/app/tree/node-op.spec.ts index 4f0eb05f9..c9f740942 100644 --- a/examples/sites/demos/pc/app/tree/node-op.spec.ts +++ b/examples/sites/demos/pc/app/tree/node-op.spec.ts @@ -1,23 +1,36 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('节点操作', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#node-op') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree') + + const insertBefore = preview.getByText('添加前节点') + const insertAfter = preview.getByText('添加后节点') + const append = preview.getByText('添加子节点') + const updateKeyChildren = preview.getByText('更新子节点') + const remove = preview.getByText('删除当前节点') + + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + + await insertBefore.click() + await expect(tree.getByText('insertBefore 1000')).toHaveCount(1) + await page.waitForTimeout(20) + + await insertAfter.click() + await expect(tree.getByText('insertAfter 1001')).toHaveCount(1) + await page.waitForTimeout(20) + + await append.click() + await expect(tree.getByText('append 1002')).toHaveCount(1) + await page.waitForTimeout(20) + + await updateKeyChildren.click() + await expect(tree.getByText('update 1003')).toHaveCount(1) + await page.waitForTimeout(20) + + await remove.click() + await expect(tree.getByText('数据 1-1')).toHaveCount(0) }) diff --git a/examples/sites/demos/pc/app/tree/other.spec.ts b/examples/sites/demos/pc/app/tree/other.spec.ts index 4f0eb05f9..e80708ff0 100644 --- a/examples/sites/demos/pc/app/tree/other.spec.ts +++ b/examples/sites/demos/pc/app/tree/other.spec.ts @@ -1,23 +1,10 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('其它', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#other') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const tree = page.locator('.pc-demo-container') + await expect(tree.getByText('数据 1')).toHaveCount(1) + await expect(tree.getByText('同时勾选下级')).toHaveCount(1) }) diff --git a/examples/sites/demos/pc/app/tree/props.spec.ts b/examples/sites/demos/pc/app/tree/props.spec.ts index 4f0eb05f9..37638dbfc 100644 --- a/examples/sites/demos/pc/app/tree/props.spec.ts +++ b/examples/sites/demos/pc/app/tree/props.spec.ts @@ -1,23 +1,12 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('属性', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#props') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const tree = page.locator('.pc-demo-container') + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + + // 测试disabled + await expect(tree.getByText('数据 2-2')).toHaveCSS('color', 'rgb(173, 176, 184)') }) diff --git a/examples/sites/demos/pc/app/tree/radio.spec.ts b/examples/sites/demos/pc/app/tree/radio.spec.ts index 4f0eb05f9..c30866a9b 100644 --- a/examples/sites/demos/pc/app/tree/radio.spec.ts +++ b/examples/sites/demos/pc/app/tree/radio.spec.ts @@ -1,23 +1,15 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('单选', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#radio') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const preview = page.locator('.pc-demo-container') + const tree = preview.locator('.tiny-tree').nth(0) + const treeChecked = tree.locator('label.is-checked') + const btn = preview.getByText('勾选指定节点') + + await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + await expect(treeChecked).toHaveCount(1) + await btn.click() }) diff --git a/examples/sites/demos/pc/app/tree/slot.spec.ts b/examples/sites/demos/pc/app/tree/slot.spec.ts index 4f0eb05f9..9f316e55f 100644 --- a/examples/sites/demos/pc/app/tree/slot.spec.ts +++ b/examples/sites/demos/pc/app/tree/slot.spec.ts @@ -1,23 +1,17 @@ import { test, expect } from '@playwright/test' -test('tree组件基本使用', async ({ page }) => { +test('插槽', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) - await page.goto('tree#basic-usage') + await page.goto('tree#slot') - const tree = page.locator('#preview .tiny-tree') - await tree.getByText('一级 1').click() - await expect(tree.locator('.tiny-tree-node').first()).toHaveClass(/is-current/) - await page.getByText('二级 1-1').click() - await expect(tree.locator('.tiny-tree-node').nth(1)).toHaveClass(/is-current/) - await page.getByRole('treeitem', { name: '三级 1-1-1' }).first().click() - await page.getByRole('treeitem', { name: '一级 3' }).locator('.tiny-svg').click() - await page - .getByRole('treeitem', { name: '一级 1' }) - .first() - .locator('div') - .filter({ hasText: '一级 1' }) - .first() - .click() - await expect(page.getByRole('treeitem', { name: '一级 1-1', includeHidden: true })).toBeHidden({ timeout: 0 }) - await page.locator('.tiny-modal__box').first().click() + const tree = page.locator('.pc-demo-container') + const button = page.getByRole('button', { name: '加载数据' }) + + // 测试无数据 + await expect(tree.getByText('组件无数据')).toHaveCount(1) + + // 测试有数据 + await button.click() + await expect(tree.getByText('数据 1-1-1')).toHaveCount(2) + await expect(tree.getByText('新增')).toHaveCount(8) })