| name | umbraco-playwright-testhelpers |
| description | Reference for @umbraco/playwright-testhelpers package - fixtures, API helpers, and UI helpers for E2E testing |
| version | 1.0.0 |
| location | managed |
| allowed-tools | Read, Write, Edit, WebFetch |
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,
ApiHelpers,
UiHelpers,
ConstantHelper,
AliasHelper,
JsonHelper
} 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 }) => {
});
How Fixtures Work
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 |
Core API Methods
await umbracoApi.get(url, params?);
await umbracoApi.post(url, data?);
await umbracoApi.delete(url, data?);
await umbracoApi.getCsrfToken();
await umbracoApi.login(skipCheckTours?: boolean);
Document Type API Helper
await umbracoApi.documentTypes.ensureNameNotExists('MyDocType');
const docType = await umbracoApi.documentTypes.createDefaultDocumentType('MyDocType');
const elementType = await umbracoApi.documentTypes.createDefaultElementType('MyElement', 'myElement');
const element = await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(element?, dataType?);
const docType = new DocumentTypeBuilder()
.withName('MyDocType')
.withAlias('myDocType')
.build();
await umbracoApi.documentTypes.save(docType);
Content API Helper
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
const dataType = await umbracoApi.dataTypes.getByName('Textstring');
const blockGrid = await umbracoApi.dataTypes.createDefaultBlockGrid('MyBlockGrid', elementType);
await umbracoApi.dataTypes.ensureNameNotExists('MyDataType');
Media API Helper
await umbracoApi.media.createDefaultMediaFolder('MyFolder');
await umbracoApi.media.createImageWithFile(
'MyImage',
{ src: '/path/to/image.jpg' },
'image.jpg',
'/local/path/to/image.jpg',
'image/jpeg'
);
await umbracoApi.media.ensureNameNotExists('MyImage');
await umbracoApi.media.clearRecycleBin();
UI Helpers (umbracoUi)
Navigation
await umbracoUi.goToSection(ConstantHelper.sections.content);
await umbracoUi.goToSection(ConstantHelper.sections.settings);
await umbracoUi.goToSection(ConstantHelper.sections.media);
await umbracoUi.navigateToContent('MyContent');
await umbracoUi.navigateToMedia('MyMedia');
await umbracoUi.navigateToDocumentType('MyDocType');
await umbracoUi.navigateToDataType('MyDataType');
await umbracoUi.navigateToTemplate('MyTemplate');
Tree Operations
const item = await umbracoUi.getTreeItem('contentTypes', ['MyFolder', 'MyDocType']);
await umbracoUi.refreshContentTree();
await umbracoUi.refreshMediaTree();
await umbracoUi.waitForTreeLoad('settings');
Click Operations
await umbracoUi.clickDataElementByElementName('tree-item-myItem');
await umbracoUi.clickButtonByText('Save');
await umbracoUi.clickElement(locator);
await umbracoUi.clickMultiple(locator);
Editor Operations
await umbracoUi.setEditorHeaderName('My Document');
await umbracoUi.getEditorHeaderName('My Document');
await umbracoUi.goToAddEditor('Content', 'Title');
Locator Getters
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');
const success = await umbracoUi.getSuccessNotification();
const error = await umbracoUi.getErrorNotification();
Assertions
await umbracoUi.isSuccessNotificationVisible();
await umbracoUi.isErrorNotificationVisible();
await umbracoUi.doesDataTypeExist('MyDataType');
Document Type UI
await umbracoUi.createNewDocumentTypeWithTemplate();
await umbracoUi.updateDocumentPermissionsToAllowCultureVariant();
Content UI
await umbracoUi.createContentWithDocumentType('MyDocType');
await umbracoUi.switchCultureInContent('Danish');
File Upload
await umbracoUi.fileUploader('/path/to/file.jpg');
Drag and Drop
await umbracoUi.dragAndDrop(
fromLocator,
toLocator,
verticalOffset,
horizontalOffset,
steps?
);
ConstantHelper
import { ConstantHelper } from '@umbraco/playwright-testhelpers';
ConstantHelper.sections.content
ConstantHelper.sections.media
ConstantHelper.sections.settings
ConstantHelper.sections.users
ConstantHelper.sections.member
ConstantHelper.sections.packages
ConstantHelper.sections.translation
ConstantHelper.actions.create
ConstantHelper.actions.delete
ConstantHelper.actions.copy
ConstantHelper.actions.move
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
AliasHelper
See umbraco-test-builders for comprehensive AliasHelper documentation.
JsonHelper
import { JsonHelper } from '@umbraco/playwright-testhelpers';
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 class
lib/helpers/UiHelpers.ts - UI helper class
lib/helpers/testExtension.ts - Test fixture extension
lib/helpers/ConstantHelper.ts - Constants
lib/helpers/AliasHelper.ts - Alias utilities