umbraco-playwright-testhelpers
SKILL.md
Umbraco Playwright Testhelpers
What is it?
@umbraco/playwright-testhelpers is the official Umbraco package that provides Playwright fixtures, API helpers, and UI helpers for writing E2E tests against an Umbraco backoffice instance.
Repository: https://github.com/umbraco/Umbraco.Playwright.Testhelpers
Installation
npm install @umbraco/playwright-testhelpers --save-dev
Related Skills
- umbraco-e2e-testing - E2E test patterns using these helpers
- umbraco-test-builders - JsonModels.Builders (used internally by testhelpers)
- umbraco-testing - Master skill for testing overview
Package Exports
The package exports these main items:
import {
test, // Extended Playwright test with fixtures
ApiHelpers, // Direct API helper class
UiHelpers, // Direct UI helper class
ConstantHelper, // Constants for sections, actions, buttons
AliasHelper, // Alias generation utilities
JsonHelper // JSON parsing utilities
} from '@umbraco/playwright-testhelpers';
Test Fixtures
The test export extends Playwright's test with two fixtures:
import { test } from '@umbraco/playwright-testhelpers';
test('my test', async ({ umbracoApi, umbracoUi }) => {
// umbracoApi - API helpers for fast test setup/teardown
// umbracoUi - UI helpers for backoffice interaction
});
How Fixtures Work
// testExtension.ts (internal)
const test = base.extend<{umbracoApi: ApiHelpers} & {umbracoUi: UiHelpers}>({
umbracoApi: async ({ page }, use) => {
const umbracoApi = new ApiHelpers(page);
await use(umbracoApi);
},
umbracoUi: async ({ page }, use) => {
const umbracoUi = new UiHelpers(page);
await use(umbracoUi);
}
});
API Helpers (umbracoApi)
The ApiHelpers class provides sub-helpers for each entity type:
| Property | Helper Class | Purpose |
|---|---|---|
content |
ContentApiHelper | Content/document operations |
documentTypes |
DocumentTypeApiHelper | Document type operations |
dataTypes |
DatatypeApiHelper | Data type operations |
media |
MediaApiHelper | Media operations |
mediaTypes |
MediaTypeApiHelper | Media type operations |
templates |
TemplatesApiHelper | Template operations |
languages |
LanguagesApiHelper | Language operations |
users |
UserApiHelper | User operations |
userGroups |
UserGroupApiHelper | User group operations |
members |
MemberApiHelper | Member operations |
memberTypes |
MemberTypeApiHelper | Member type operations |
memberGroups |
MemberGroupApiHelper | Member group operations |
macros |
MacroApiHelper | Macro operations |
scripts |
ScriptApiHelper | Script operations |
stylesheets |
StylesheetApiHelper | Stylesheet operations |
partialViews |
PartialViewApiHelper | Partial view operations |
relationTypes |
RelationTypeApiHelper | Relation type operations |
packages |
PackageApiHelper | Package operations |
domain |
DomainApiHelper | Domain operations |
translation |
TranslationApiHelper | Translation operations |
webhook |
WebhookApiHelper | Webhook operations |
Core API Methods
// Base HTTP methods (available on umbracoApi directly)
await umbracoApi.get(url, params?);
await umbracoApi.post(url, data?);
await umbracoApi.delete(url, data?);
// CSRF token (automatically handled)
await umbracoApi.getCsrfToken();
// Login
await umbracoApi.login(skipCheckTours?: boolean);
Document Type API Helper
// Ensure cleanup (idempotent - won't fail if not exists)
await umbracoApi.documentTypes.ensureNameNotExists('MyDocType');
// Create default document type
const docType = await umbracoApi.documentTypes.createDefaultDocumentType('MyDocType');
// Create element type (for blocks)
const elementType = await umbracoApi.documentTypes.createDefaultElementType('MyElement', 'myElement');
// Create document type with block grid
const element = await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(element?, dataType?);
// Save document type (using builder)
const docType = new DocumentTypeBuilder()
.withName('MyDocType')
.withAlias('myDocType')
.build();
await umbracoApi.documentTypes.save(docType);
Content API Helper
// Reference: ContentApiHelper.ts patterns
// Note: Actual methods depend on version - check source
// Common patterns:
await umbracoApi.content.ensureNameNotExists('MyContent');
await umbracoApi.content.createDefaultContent(name, documentTypeId);
await umbracoApi.content.getByName('MyContent');
await umbracoApi.content.publish(contentId);
Data Type API Helper
// Get built-in data type
const dataType = await umbracoApi.dataTypes.getByName('Textstring');
// Create block grid data type
const blockGrid = await umbracoApi.dataTypes.createDefaultBlockGrid('MyBlockGrid', elementType);
// Ensure cleanup
await umbracoApi.dataTypes.ensureNameNotExists('MyDataType');
Media API Helper
// Create media folder
await umbracoApi.media.createDefaultMediaFolder('MyFolder');
// Create image with file
await umbracoApi.media.createImageWithFile(
'MyImage',
{ src: '/path/to/image.jpg' },
'image.jpg',
'/local/path/to/image.jpg',
'image/jpeg'
);
// Cleanup
await umbracoApi.media.ensureNameNotExists('MyImage');
await umbracoApi.media.clearRecycleBin();
UI Helpers (umbracoUi)
Navigation
// Navigate to section
await umbracoUi.goToSection(ConstantHelper.sections.content);
await umbracoUi.goToSection(ConstantHelper.sections.settings);
await umbracoUi.goToSection(ConstantHelper.sections.media);
// Navigate to specific items
await umbracoUi.navigateToContent('MyContent');
await umbracoUi.navigateToMedia('MyMedia');
await umbracoUi.navigateToDocumentType('MyDocType');
await umbracoUi.navigateToDataType('MyDataType');
await umbracoUi.navigateToTemplate('MyTemplate');
Tree Operations
// Get tree item by path
const item = await umbracoUi.getTreeItem('contentTypes', ['MyFolder', 'MyDocType']);
// Refresh trees
await umbracoUi.refreshContentTree();
await umbracoUi.refreshMediaTree();
// Wait for tree load
await umbracoUi.waitForTreeLoad('settings');
Click Operations
// Click by data-element attribute
await umbracoUi.clickDataElementByElementName('tree-item-myItem');
// Click by text
await umbracoUi.clickButtonByText('Save');
// Click element
await umbracoUi.clickElement(locator);
// Click multiple elements
await umbracoUi.clickMultiple(locator);
Editor Operations
// Set header name (with alias generation wait)
await umbracoUi.setEditorHeaderName('My Document');
// Get editor header name
await umbracoUi.getEditorHeaderName('My Document');
// Add property group and editor
await umbracoUi.goToAddEditor('Content', 'Title');
Locator Getters
// Get elements
const helpButton = await umbracoUi.getGlobalHelp();
const userButton = await umbracoUi.getGlobalUser();
const element = await umbracoUi.getDataElementByElementName('my-element');
const button = await umbracoUi.getButtonByText('Save');
const button = await umbracoUi.getButtonByLabelKey('buttons_save');
const contextAction = await umbracoUi.getContextMenuAction('action-create');
// Notifications
const success = await umbracoUi.getSuccessNotification();
const error = await umbracoUi.getErrorNotification();
Assertions
// Check notifications
await umbracoUi.isSuccessNotificationVisible();
await umbracoUi.isErrorNotificationVisible();
// Check data type exists
await umbracoUi.doesDataTypeExist('MyDataType');
Document Type UI
// Create with template
await umbracoUi.createNewDocumentTypeWithTemplate();
// Update permissions
await umbracoUi.updateDocumentPermissionsToAllowCultureVariant();
Content UI
// Create content
await umbracoUi.createContentWithDocumentType('MyDocType');
// Switch culture
await umbracoUi.switchCultureInContent('Danish');
File Upload
// Upload file
await umbracoUi.fileUploader('/path/to/file.jpg');
Drag and Drop
// Drag and drop elements
await umbracoUi.dragAndDrop(
fromLocator,
toLocator,
verticalOffset,
horizontalOffset,
steps?
);
ConstantHelper
import { ConstantHelper } from '@umbraco/playwright-testhelpers';
// Sections
ConstantHelper.sections.content // "content"
ConstantHelper.sections.media // "media"
ConstantHelper.sections.settings // "settings"
ConstantHelper.sections.users // "users"
ConstantHelper.sections.member // "member"
ConstantHelper.sections.packages // "packages"
ConstantHelper.sections.translation // "translation"
// Actions (data-element values)
ConstantHelper.actions.create // "action-create"
ConstantHelper.actions.delete // "action-delete"
ConstantHelper.actions.copy // "action-copy"
ConstantHelper.actions.move // "action-move"
ConstantHelper.actions.sort // "action-sort"
ConstantHelper.actions.save // "saveNew"
ConstantHelper.actions.publish // "publishNew"
ConstantHelper.actions.documentType // "action-documentType"
ConstantHelper.actions.dataType // "action-data-type"
ConstantHelper.actions.remove // "actions_remove"
// Buttons (label-key values)
ConstantHelper.buttons.save // "buttons_save"
ConstantHelper.buttons.saveAndPublish // "buttons_saveAndPublish"
ConstantHelper.buttons.delete // "general_delete"
ConstantHelper.buttons.ok // "general_ok"
ConstantHelper.buttons.close // "general_close"
ConstantHelper.buttons.insert // "general_insert"
ConstantHelper.buttons.download // "general_download"
ConstantHelper.buttons.submit // "general_submit"
ConstantHelper.buttons.rollback // "actions_rollback"
ConstantHelper.buttons.add // "general_add"
ConstantHelper.buttons.submitChanges // "buttons_submitChanges"
ConstantHelper.buttons.remove // "general_remove"
ConstantHelper.buttons.change // "general_change"
ConstantHelper.buttons.select // "buttons_select"
// Content Apps
ConstantHelper.contentApps.info // '[data-element="sub-view-umbInfo"]'
AliasHelper
See umbraco-test-builders for comprehensive AliasHelper documentation.
JsonHelper
import { JsonHelper } from '@umbraco/playwright-testhelpers';
// Parse response body
const response = await umbracoApi.get(url);
const body = await JsonHelper.getBody(response);
Complete Examples
See umbraco-e2e-testing for full test examples and templates.
Source Reference
- Repository: https://github.com/umbraco/Umbraco.Playwright.Testhelpers
- Local path:
/Users/philw/Projects/Umbraco.Playwright.Testhelpers/ - Main files:
lib/helpers/ApiHelpers.ts- API helper classlib/helpers/UiHelpers.ts- UI helper classlib/helpers/testExtension.ts- Test fixture extensionlib/helpers/ConstantHelper.ts- Constantslib/helpers/AliasHelper.ts- Alias utilities
Weekly Installs
46
Repository
umbraco/umbraco…e-skillsGitHub Stars
13
First Seen
Feb 4, 2026
Security Audits
Installed on
github-copilot34
opencode17
codex17
claude-code16
gemini-cli15
amp15