API-reference

Denne Power Platform Playwright toolkit API refererer til offentlige klasser, metoder og typer, som du kan bruge til at automatisere komplette test af lærredsapps og modeldrevne apps.

AppProvider

Indgangspunkt til start af Power Platform-apps. Instantier én gang pr. test, og kald launch()derefter .

class AppProvider {
  constructor(page: Page, context: BrowserContext)

  launch(options: AppLaunchOptions): Promise<void>
  getModelDrivenAppPage(): ModelDrivenAppPage
  getCanvasAppPage(): CanvasAppPage
  getGenUxPage(): GenUxPage
}

AppLaunchOptions

Indstillinger, der overføres til AppProvider.launch() for at konfigurere, hvilken app der skal åbnes, og hvordan.

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

Angiver den type Power Platform-app, der skal startes.

enum AppType {
  Canvas = 'canvas',
  ModelDriven = 'model-driven',
}

AppLaunchMode

Bestemmer, om appen åbnes i afspilningstilstand eller redigeringstilstand.

enum AppLaunchMode {
  Play = 'play',
  Edit = 'edit',
}

ModelDrivenAppPage

Returneret af AppProvider.getModelDrivenAppPage(). Giver adgang til navigation og komponenter.

class ModelDrivenAppPage {
  readonly grid: GridComponent
  readonly form: FormComponent
  readonly commanding: CommandingComponent

  navigateToGridView(entityLogicalName: string): Promise<void>
  navigateToFormView(entityLogicalName: string): Promise<void>
}

GridComponent

Ombryder det AG-gitter, der bruges i modeldrevne listevisninger. Tilgås via 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

Indstillinger til identifikation af, hvilken post der skal åbnes fra gitteret.

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

Ombryder kørselstiden for Dynamics 365 formular. Tilgås via 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()

Kører vilkårlig kode i browserens formularkontekst med fuld adgang til Xrm-klient-API'en:

const value = await mda.form.execute(
  (ctx) => ctx.getAttribute('nwind_ordernumber')?.getValue()
);

Se API-test via formularkontekst for at få mere at vide om brug.


CommandingComponent

Ombryder kommandolinjen for den modeldrevne app. Tilgås via ModelDrivenAppPage.commanding.

class CommandingComponent {
  clickButton(ariaLabel: string): Promise<void>
  clickMoreCommands(): Promise<void>
}

CanvasAppPage

Returneret af AppProvider.getCanvasAppPage(). Leverer lærredets iframe-rammelokator.

class CanvasAppPage {
  getFrame(): FrameLocator
  waitForLoad(controlName?: string): Promise<void>
}

GenUxPage

Returneret af AppProvider.getGenUxPage(). Leverer interaktioner med Power Apps Maker Portal GenUX AI-designer til oprettelse, generering, undersøgelse og publicering af modeldrevne apps fra AI-prompts.

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

FrameLocator Viser for UCI Preview-iframe. Brug denne egenskab til at forespørge om genererede formularelementer direkte:

const input = genUxPage.previewFrame.getByRole('textbox', { name: 'First Name' });
await expect(input).toBeVisible();

GenUxPage.verifyThoughtStreaming()

Kontrollerer, om der er midlertidige GenUX-streamingindikatorer, f.eks. tanketekst, stopknap og Agent tanker. Hver kontrol er den bedste indsats – generering kan fuldføres, før alle indikatorer vises. Den eneste hårde antagelse er, at enten streaming er i gang eller "Your page is now generated" er synlig.

GenUxPage.searchAndPlayApp()

Returnerer null , når Afspil er deaktiveret (appen er endnu ikke publiceret) i stedet for at udløse en fejl. Bruges test.skip() ved returnering null :

const appPage = await genUxPage.searchAndPlayApp(appName, context);
if (!appPage) test.skip();

Hjælpefunktioner

Separate hjælpefunktioner til almindelige konfigurationsopgaver.

buildCanvasAppUrlFromEnv

CANVAS_APP_URL Læser fra miljøet:

function buildCanvasAppUrlFromEnv(): string

getStorageStatePath

Returnerer stien til Power Apps lagertilstandsfilen for den angivne mail:

function getStorageStatePath(email: string): string
// Returns: packages/e2e-tests/.playwright-ms-auth/state-<email>.json

ConfigHelper

Leverer konfigurationshjælpeenheder, f.eks. kontrol af, om den cachelagrede lagertilstand er udløbet.

class ConfigHelper {
  static checkStorageStateExpiration(
    statePath: string
  ): { expired: boolean; expiresOn?: number }
}

Hjælpeprogrammer til lokalisering

Hjælpemetoder til at finde Power Apps kontrolelementer inden for iframes.

LocatorUtils

Statiske metoder til at finde kontrolelementer til lærredsapps og gallerielementer efter navn.

class LocatorUtils {
  static getByControlName(frame: FrameLocator, controlName: string): Locator
  static getGalleryItem(frame: FrameLocator, titleText: string): Locator
}

Typeeksport

Eksportér alle typer fra pakkeroden:

import {
  AppProvider,
  AppType,
  AppLaunchMode,
  AppLaunchOptions,
  ModelDrivenAppPage,
  GridComponent,
  FormComponent,
  CommandingComponent,
  CanvasAppPage,
  GenUxPage,
  buildCanvasAppUrlFromEnv,
  getStorageStatePath,
  ConfigHelper,
  LocatorUtils,
} from 'power-platform-playwright-toolkit';

Næste trin

Se også