Rujukan API

API kit alat Power Platform Playwright ini merujuk kepada kelas, kaedah dan jenis awam yang boleh anda gunakan untuk mengautomasikan ujian hujung ke hujung kanvas dan apl dipacu model.

AppProvider

Titik masuk untuk melancarkan apl Power Platform. Sertakan sekali setiap ujian, kemudian panggil launch().

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

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

AppLaunchOptions

Pilihan yang dihantar untuk AppProvider.launch() mengkonfigurasi apl mana yang hendak dibuka dan bagaimana.

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

Menentukan jenis aplikasi Power Platform untuk dilancarkan.

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

AppLaunchMode

Menentukan sama ada apl dibuka dalam mod main atau mod edit.

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

ModelDrivenAppPage

Dikembalikan oleh AppProvider.getModelDrivenAppPage(). Menyediakan navigasi dan akses komponen.

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

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

GridComponent

Membungkus Grid AG yang digunakan dalam pandangan senarai dipacu model. Diakses melalui 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

Pilihan untuk mengenal pasti rekod yang hendak dibuka daripada grid.

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

Membungkus masa jalan borang Dynamics 365. Diakses melalui 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()

Menjalankan kod sewenang-wenangnya dalam konteks borang penyemak imbas dengan akses penuh kepada API Pelanggan Xrm:

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

Lihat ujian API melalui konteks borang untuk penggunaan terperinci.


CommandingComponent

Membungkus bar perintah apl dipacu model. Diakses melalui ModelDrivenAppPage.commanding.

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

CanvasAppPage

Dikembalikan oleh AppProvider.getCanvasAppPage(). Menyediakan pencari bingkai iframe kanvas.

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

GenUxPage

Dikembalikan oleh AppProvider.getGenUxPage(). Menyediakan interaksi dengan pereka bentuk AI GenUX Power Apps Maker Portal untuk mencipta, menjana, memeriksa dan menerbitkan apl dipacu model daripada gesaan AI.

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

Mendedahkan untuk FrameLocator iframe Pratonton UCI. Gunakan sifat ini untuk menanyakan elemen borang yang dijana secara langsung:

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

GenUxPage.verifyThoughtStreaming()

Menyemak penunjuk penstriman GenUX sementara, seperti teks pemikiran, butang Berhenti dan Pemikiran Ejen. Setiap semakan adalah usaha terbaik - penjanaan mungkin selesai sebelum semua penunjuk muncul. Satu-satunya penegasan keras ialah sama ada penstriman sedang berjalan atau "Your page is now generated" kelihatan.

GenUxPage.searchAndPlayApp()

Kembali null apabila Main dinyahdayakan (apl belum diterbitkan) dan bukannya membuang ralat. Gunakan test.skip() semasa pemulangan null :

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

Fungsi utiliti

Fungsi pembantu kendiri untuk tugas persediaan dan konfigurasi biasa.

buildCanvasAppUrlFromEnv

Membaca CANVAS_APP_URL daripada persekitaran:

function buildCanvasAppUrlFromEnv(): string

getStorageStatePath

Mengembalikan laluan ke fail keadaan storan Power Apps untuk e-mel yang diberikan:

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

ConfigHelper

Menyediakan pembantu konfigurasi, seperti menyemak sama ada keadaan storan cache telah tamat tempoh.

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

Utiliti pencari

Kaedah pembantu untuk mencari kawalan Power Apps dalam iframe.

LocatorUtils

Kaedah statik untuk mencari kawalan apl kanvas dan item galeri mengikut nama.

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

Eksport jenis

Eksport semua jenis daripada akar pakej:

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

Langkah seterusnya

Lihat juga