n8n/packages/testing/playwright/pages/BasePage.ts
Filipe Tavares eeaa26ee1f
fix(editor): Unify onboarding empty states across overview and project tabs (#33670)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 12:18:24 +00:00

82 lines
2.5 KiB
TypeScript

import type { Locator, Page } from '@playwright/test';
import { BaseModal } from './components/BaseModal';
import { FloatingUiHelper } from './components/FloatingUiHelper';
export abstract class BasePage extends FloatingUiHelper {
protected readonly baseModal: BaseModal;
constructor(protected readonly page: Page) {
super(page);
this.baseModal = new BaseModal(this.page);
}
/**
* Search input on the shared resources-list layout used across list pages
* (workflows, credentials, variables, etc.).
*/
protected getResourcesListSearch(): Locator {
return this.page.getByTestId('resources-list-search');
}
/**
* Root of the shared empty-state box rendered on the list pages
* (workflows, credentials, variables, data tables, executions).
*/
protected getResourcesListEmptyState(): Locator {
return this.page.getByTestId('empty-resources-list');
}
protected async clickByTestId(testId: string) {
await this.page.getByTestId(testId).click();
}
protected async fillByTestId(testId: string, value: string) {
await this.page.getByTestId(testId).fill(value);
}
protected async clickByText(text: string) {
await this.page.getByText(text).click();
}
protected async clickButtonByName(name: string) {
await this.page.getByRole('button', { name }).click();
}
protected async waitForRestResponse(
url: string | RegExp,
method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',
) {
if (typeof url === 'string') {
return await this.page.waitForResponse((res) => {
const matches = res.url().includes(url);
return matches && (method ? res.request().method() === method : true);
});
}
return await this.page.waitForResponse((res) => {
const matches = url.test(res.url());
return matches && (method ? res.request().method() === method : true);
});
}
/**
* Wait for debounce to complete.
* Respects the N8N_DEBOUNCE_MULTIPLIER sessionStorage setting.
* With multiplier=0 (test mode), returns immediately.
* @param baseTime - Base debounce time in milliseconds (default: 150)
*/
protected async waitForDebounce(baseTime = 150): Promise<void> {
const effectiveTime = await this.page.evaluate((time) => {
const stored = sessionStorage.getItem('N8N_DEBOUNCE_MULTIPLIER');
const multiplier = stored !== null ? parseFloat(stored) : 1;
return Math.round(time * (Number.isNaN(multiplier) ? 1 : multiplier));
}, baseTime);
if (effectiveTime > 0) {
// eslint-disable-next-line playwright/no-wait-for-timeout
await this.page.waitForTimeout(effectiveTime);
}
}
}