universo-platform-2d
136 строк · 3.8 Кб
1import type { Locator, Page } from '@playwright/test';2import { expect } from '@playwright/test';3
4export async function waitForEditorLoad(page: Page) {5await page.waitForSelector('v-line', {6timeout: 20000,7});8}
9
10export async function waitForAllPagesLoad(page: Page) {11// if filters tag is rendered, we believe all_pages is ready12await page.waitForSelector('[data-testid="create-first-filter"]', {13timeout: 20000,14});15}
16
17export async function clickNewPageButton(page: Page, title?: string) {18// FiXME: when the page is in edgeless mode, clickNewPageButton will create a new edgeless page19const edgelessPage = page.locator('edgeless-editor');20if (await edgelessPage.isVisible()) {21await page.getByTestId('switch-page-mode-button').click({22delay: 100,23});24}25// fixme(himself65): if too fast, the page will crash26await page.getByTestId('sidebar-new-page-button').click({27delay: 100,28});29await waitForEmptyEditor(page);30if (title) {31await getBlockSuiteEditorTitle(page).fill(title);32}33}
34
35export async function waitForEmptyEditor(page: Page) {36await expect(page.locator('.doc-title-container-empty')).toBeVisible();37}
38
39export function getBlockSuiteEditorTitle(page: Page) {40return page.locator('doc-title .inline-editor').nth(0);41}
42
43export async function type(page: Page, content: string, delay = 50) {44await page.keyboard.type(content, { delay });45}
46
47export const createLinkedPage = async (page: Page, pageName?: string) => {48// fixme: workaround for @ popover not showing up when editor is not ready49await page.waitForTimeout(500);50await page.keyboard.type('@', { delay: 50 });51const linkedPagePopover = page.locator('.linked-doc-popover');52await expect(linkedPagePopover).toBeVisible();53await type(page, pageName || 'Untitled');54
55await page.keyboard.press('ArrowUp');56await page.keyboard.press('ArrowUp');57await page.keyboard.press('Enter', { delay: 50 });58};59
60export async function clickPageMoreActions(page: Page) {61return page62.getByTestId('header')63.getByTestId('header-dropDownButton')64.click();65}
66
67export const getPageOperationButton = (page: Page, id: string) => {68return getPageItem(page, id).getByTestId('page-list-operation-button');69};70
71export const getPageItem = (page: Page, id: string) => {72return page.locator(`[data-page-id="${id}"][data-testid="page-list-item"]`);73};74
75export const getPageByTitle = (page: Page, title: string) => {76return page.getByTestId('page-list-item').getByText(title);77};78
79export const dragTo = async (80page: Page,81locator: Locator,82target: Locator,83location:84| 'top-left'85| 'top'86| 'bottom'87| 'center'88| 'left'89| 'right' = 'center'90) => {91await locator.hover();92await page.mouse.down();93await page.mouse.move(1, 1);94
95const targetElement = await target.boundingBox();96if (!targetElement) {97throw new Error('target element not found');98}99const position = (() => {100switch (location) {101case 'center':102return {103x: targetElement.width / 2,104y: targetElement.height / 2,105};106case 'top':107return { x: targetElement.width / 2, y: 1 };108case 'bottom':109return { x: targetElement.width / 2, y: targetElement.height - 1 };110
111case 'left':112return { x: 1, y: targetElement.height / 2 };113
114case 'right':115return { x: targetElement.width - 1, y: targetElement.height / 2 };116
117case 'top-left':118default:119return { x: 1, y: 1 };120}121})();122await target.hover({123position: position,124});125await page.mouse.up();126};127
128// sometimes editor loses focus, this function is to focus the editor
129export const focusInlineEditor = async (page: Page) => {130await page131.locator(132`.affine-paragraph-rich-text-wrapper:has(.visible):has-text("Type '/' for commands")`133)134.locator('.inline-editor')135.focus();136};137