Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Diese Power Platform Playwright-Toolkit-API referenzieren öffentliche Klassen, Methoden und Typen, mit deren Hilfe Sie End-to-End-Tests von Canvas- und modellgesteuerten Apps automatisieren können.
AppProvider
Einstiegspunkt für das Starten von Power Platform-Apps. Instanziieren Sie einmal pro Test, und rufen Sie dann auf launch().
class AppProvider {
constructor(page: Page, context: BrowserContext)
launch(options: AppLaunchOptions): Promise<void>
getModelDrivenAppPage(): ModelDrivenAppPage
getCanvasAppPage(): CanvasAppPage
getGenUxPage(): GenUxPage
}
AppLaunchOptions
Optionen, die übergeben werden, um AppProvider.launch() zu konfigurieren, welche App geöffnet werden soll und wie.
interface AppLaunchOptions {
app: string; // Display name of the app
type: AppType; // Canvas | ModelDriven
mode: AppLaunchMode; // Play | Edit
skipMakerPortal?: boolean; // true: use directUrl, skip make.powerapps.com navigation
directUrl?: string; // Full URL when skipMakerPortal is true
}
AppType
Gibt den Typ der zu startenden Power Platform-App an.
enum AppType {
Canvas = 'canvas',
ModelDriven = 'model-driven',
}
AppLaunchMode
Bestimmt, ob die App im Wiedergabemodus oder im Bearbeitungsmodus geöffnet wird.
enum AppLaunchMode {
Play = 'play',
Edit = 'edit',
}
ModelDrivenAppPage
Zurückgegeben von AppProvider.getModelDrivenAppPage(). Bietet Navigations- und Komponentenzugriff.
class ModelDrivenAppPage {
readonly grid: GridComponent
readonly form: FormComponent
readonly commanding: CommandingComponent
navigateToGridView(entityLogicalName: string): Promise<void>
navigateToFormView(entityLogicalName: string): Promise<void>
}
GridComponent
Umschließt das AG-Raster , das in modellgesteuerten Listenansichten verwendet wird. Zugriff über ModelDrivenAppPage.grid.
class GridComponent {
waitForGridLoad(): Promise<void>
filterByKeyword(keyword: string): Promise<void>
filterByColumn(columnName: string, value: string): Promise<void>
getCellValue(rowIndex: number, columnName: string): Promise<string | null>
getRowCount(): Promise<number>
isGridEmpty(): Promise<boolean>
openRecord(options: OpenRecordOptions): Promise<void>
selectRow(rowIndex: number): Promise<void>
selectRows(rowIndexes: number[]): Promise<void>
}
OpenRecordOptions
Optionen zum Identifizieren, welcher Datensatz aus dem Raster geöffnet werden soll.
interface OpenRecordOptions {
rowNumber?: number; // 0-based row index
columnName?: string; // column to match (display name or schema name)
columnValue?: string; // value to match in the column
}
FormComponent
Umschließt die Dynamics 365 Formularlaufzeit. Zugriff über ModelDrivenAppPage.form.
class FormComponent {
getAttribute(fieldName: string): Promise<string | null>
setAttribute(fieldName: string, value: string): Promise<void>
save(): Promise<void>
isDirty(): Promise<boolean>
isValid(): Promise<boolean>
navigateToTab(tabName: string): Promise<void>
setFieldVisibility(fieldName: string, visible: boolean): Promise<void>
setFieldDisabled(fieldName: string, disabled: boolean): Promise<void>
setFieldRequiredLevel(
fieldName: string,
level: 'none' | 'recommended' | 'required'
): Promise<void>
execute<T>(
fn: (formContext: Xrm.FormContext) => T | Promise<T>
): Promise<T>
}
FormComponent.execute()
Führt beliebigen Code im Formularkontext des Browsers mit vollständigem Zugriff auf die Xrm-Client-API aus:
const value = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_ordernumber')?.getValue()
);
Ausführliche Verwendung finden Sie unter API-Tests über den Formularkontext .
CommandingComponent
Umschließt die modellgesteuerte App-Befehlsleiste. Zugriff über ModelDrivenAppPage.commanding.
class CommandingComponent {
clickButton(ariaLabel: string): Promise<void>
clickMoreCommands(): Promise<void>
}
CanvasAppPage
Zurückgegeben von AppProvider.getCanvasAppPage(). Stellt den Canvas-iframe-Frame-Locator bereit.
class CanvasAppPage {
getFrame(): FrameLocator
waitForLoad(controlName?: string): Promise<void>
}
GenUxPage
Zurückgegeben von AppProvider.getGenUxPage(). Bietet Interaktionen mit dem Power Apps Maker Portal GenUX AI Designer zum Erstellen, Generieren, Prüfen und Veröffentlichen modellgesteuerter Apps aus KI-Eingabeaufforderungen.
class GenUxPage {
readonly previewFrame: FrameLocator // UCI Preview iframe locator
// Power Apps navigation
goToAppsPage(): Promise<void>
navigateToStartWithPageDesign(): Promise<void>
createAppWithName(appName: string): Promise<void>
addNewPage(): Promise<void>
// AI generation
waitForUCIPreviewFrameAndFillPrompt(prompt: string): Promise<void>
waitForUCIPreviewFrameAndSelectTemplate(templateText: string): Promise<void>
verifyThoughtStreaming(): Promise<void>
verifyCodeAndPreviewTabsAvailable(): Promise<void>
verifyCodeStreaming(): Promise<void>
// Inspection
clickPreviewTab(): Promise<void>
clickCodeTab(): Promise<void>
waitForGeneratedContent(): Promise<void>
waitForCodeTabContent(): Promise<void>
getPreviewTabDom(): Promise<string>
getCodeTabContent(): Promise<string>
// Publishing
publishApp(): Promise<void>
buildCanvasPlayUrl(): string
// Form interaction
submitForm(): Promise<void>
waitForSubmitSuccess(timeout?: number): Promise<void>
// App management
getAppIdFromUrl(): string
searchAndPlayApp(appName: string, context: BrowserContext): Promise<Page | null>
deleteAppsMatchingPrefix(prefix: string): Promise<void>
deleteAppFromAppListIfFound(appName: string): Promise<void>
}
GenUxPage.previewFrame
Macht den FrameLocator UCI Preview iframe verfügbar. Verwenden Sie diese Eigenschaft, um generierte Formularelemente direkt abzufragen:
const input = genUxPage.previewFrame.getByRole('textbox', { name: 'First Name' });
await expect(input).toBeVisible();
GenUxPage.verifyThoughtStreaming()
Sucht nach vorübergehenden GenUX-Streamingindikatoren, z. B. gedankentext, Schaltfläche "Beenden" und "Agent Gedanken". Jede Überprüfung ist am besten bemüht – die Generierung kann abgeschlossen werden, bevor alle Indikatoren angezeigt werden. Die einzige harte Behauptung besteht darin, dass entweder Streaming ausgeführt wird oder "Your page is now generated" sichtbar ist.
GenUxPage.searchAndPlayApp()
Gibt zurück null , wenn "Wiedergeben" deaktiviert ist (die App wird noch nicht veröffentlicht), anstatt einen Fehler zu auslösen. Verwenden sie test.skip() für eine null Rückgabe:
const appPage = await genUxPage.searchAndPlayApp(appName, context);
if (!appPage) test.skip();
Hilfsprogrammfunktionen
Eigenständige Hilfsfunktionen für allgemeine Setup- und Konfigurationsaufgaben.
buildCanvasAppUrlFromEnv
CANVAS_APP_URL Liest aus der Umgebung:
function buildCanvasAppUrlFromEnv(): string
getStorageStatePath
Gibt den Pfad zur Power Apps Speicherstatusdatei für die angegebene E-Mail zurück:
function getStorageStatePath(email: string): string
// Returns: packages/e2e-tests/.playwright-ms-auth/state-<email>.json
ConfigHelper
Stellt Konfigurationshilfsprogramme bereit, z. B. die Überprüfung, ob der Cachespeicherstatus abgelaufen ist.
class ConfigHelper {
static checkStorageStateExpiration(
statePath: string
): { expired: boolean; expiresOn?: number }
}
Locator-Dienstprogramme
Hilfsmethoden zum Suchen von Power Apps Steuerelementen in iframes.
LocatorUtils
Statische Methoden zum Suchen nach Canvas-App-Steuerelementen und Katalogelementen nach Namen.
class LocatorUtils {
static getByControlName(frame: FrameLocator, controlName: string): Locator
static getGalleryItem(frame: FrameLocator, titleText: string): Locator
}
Typexporte
Alle Typen aus dem Paketstamm exportieren:
import {
AppProvider,
AppType,
AppLaunchMode,
AppLaunchOptions,
ModelDrivenAppPage,
GridComponent,
FormComponent,
CommandingComponent,
CanvasAppPage,
GenUxPage,
buildCanvasAppUrlFromEnv,
getStorageStatePath,
ConfigHelper,
LocatorUtils,
} from 'power-platform-playwright-toolkit';