import type { Locator } from '@playwright/test'; import { BasePage } from './BasePage'; export class CanvasPage extends BasePage { saveWorkflowButton(): Locator { return this.page.getByRole('button', { name: 'Save' }); } nodeCreatorItemByName(text: string): Locator { return this.page.getByTestId('node-creator-item-name').getByText(text, { exact: true }); } nodeCreatorSubItem(subItemText: string): Locator { return this.page.getByTestId('node-creator-item-name').getByText(subItemText, { exact: true }); } nodeByName(nodeName: string): Locator { return this.page.locator(`[data-test-id="canvas-node"][data-node-name="${nodeName}"]`); } nodeToolbar(nodeName: string): Locator { return this.nodeByName(nodeName).getByTestId('canvas-node-toolbar'); } nodeDeleteButton(nodeName: string): Locator { return this.nodeToolbar(nodeName).getByTestId('delete-node-button'); } async clickCanvasPlusButton(): Promise { await this.clickByTestId('canvas-plus-button'); } async clickNodeCreatorPlusButton(): Promise { await this.clickByTestId('node-creator-plus-button'); } async clickSaveWorkflowButton(): Promise { await this.clickButtonByName('Save'); } async fillNodeCreatorSearchBar(text: string): Promise { await this.fillByTestId('node-creator-search-bar', text); } async clickNodeCreatorItemName(text: string): Promise { await this.nodeCreatorItemByName(text).click(); } async addNode(text: string): Promise { await this.clickNodeCreatorPlusButton(); await this.fillNodeCreatorSearchBar(text); await this.clickNodeCreatorItemName(text); } async addNodeToCanvasWithSubItem(searchText: string, subItemText: string): Promise { await this.addNode(searchText); await this.nodeCreatorSubItem(subItemText).click(); } async deleteNodeByName(nodeName: string): Promise { await this.nodeDeleteButton(nodeName).click(); } async saveWorkflow(): Promise { await this.clickSaveWorkflowButton(); } async clickExecuteWorkflowButton(): Promise { await this.page.getByTestId('execute-workflow-button').click(); } async clickDebugInEditorButton(): Promise { await this.page.getByRole('button', { name: 'Debug in editor' }).click(); } async pinNodeByNameUsingContextMenu(nodeName: string): Promise { await this.nodeByName(nodeName).click({ button: 'right' }); await this.page.getByTestId('context-menu').getByText('Pin').click(); } async unpinNodeByNameUsingContextMenu(nodeName: string): Promise { await this.nodeByName(nodeName).click({ button: 'right' }); await this.page.getByText('Unpin').click(); } async openNode(nodeName: string): Promise { await this.nodeByName(nodeName).dblclick(); } /** * Get the names of all pinned nodes on the canvas. * @returns An array of node names. */ async getPinnedNodeNames(): Promise { const pinnedNodesLocator = this.page .getByTestId('canvas-node') .filter({ has: this.page.getByTestId('canvas-node-status-pinned') }); const names: string[] = []; const count = await pinnedNodesLocator.count(); for (let i = 0; i < count; i++) { const node = pinnedNodesLocator.nth(i); const name = await node.getAttribute('data-node-name'); if (name) { names.push(name); } } return names; } async clickExecutionsTab(): Promise { await this.page.getByRole('radio', { name: 'Executions' }).click(); } }