Referensi API

API toolkit Power Platform Playwright ini mereferensikan kelas publik, metode, dan jenis yang dapat Anda gunakan untuk mengotomatiskan pengujian kanvas dan aplikasi berbasis model secara menyeluruh.

AppProvider

Titik masuk untuk meluncurkan aplikasi Power Platform. Buat instans sekali per pengujian, lalu panggil launch().

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

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

AppLaunchOptions

Opsi diteruskan ke AppProvider.launch() untuk mengonfigurasi aplikasi mana yang akan dibuka dan caranya.

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 yang akan diluncurkan.

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

AppLaunchMode

Menentukan apakah aplikasi terbuka dalam mode putar atau mode edit.

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

ModelDrivenAppPage

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

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

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

GridComponent

Membungkus Kisi AG yang digunakan dalam tampilan daftar berbasis 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

Opsi untuk mengidentifikasi rekaman mana yang akan dibuka dari kisi.

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 runtime formulir 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 kode arbitrer dalam konteks formulir browser dengan akses penuh ke Xrm Client API:

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

Lihat Pengujian API melalui konteks formulir untuk penggunaan terperinci.


CommandingComponent

Membungkus bilah perintah aplikasi berbasis 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 perancang AI GenUX Portal Power Apps Maker untuk membuat, menghasilkan, memeriksa, dan menerbitkan aplikasi berbasis model dari perintah 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

FrameLocator Mengekspos iframe Pratinjau UCI. Gunakan properti ini untuk mengkueri elemen formulir yang dihasilkan secara langsung:

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

GenUxPage.verifyThoughtStreaming()

Memeriksa indikator streaming GenUX sementara, seperti teks pemikiran, tombol Berhenti, dan Pikiran Agen. Setiap pemeriksaan adalah upaya terbaik - pembuatan mungkin selesai sebelum semua indikator muncul. Satu-satunya pernyataan keras adalah bahwa streaming sedang berlangsung atau "Your page is now generated" terlihat.

GenUxPage.searchAndPlayApp()

null Mengembalikan saat Play dinonaktifkan (aplikasi belum dipublikasikan) daripada melemparkan kesalahan. Gunakan test.skip() saat null pengembalian:

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

Fungsi utilitas

Fungsi pembantu mandiri untuk tugas penyiapan dan konfigurasi umum.

buildCanvasAppUrlFromEnv

Bacaan CANVAS_APP_URL dari lingkungan:

function buildCanvasAppUrlFromEnv(): string

getStorageStatePath

Mengembalikan jalur ke file status penyimpanan Power Apps untuk email yang diberikan:

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

ConfigHelper

Menyediakan pembantu konfigurasi, seperti memeriksa apakah status penyimpanan yang di-cache kedaluwarsa.

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

Utilitas pencari lokasi

Metode pembantu untuk menemukan kontrol Power Apps dalam iframe.

LocatorUtils

Metode statis untuk menemukan kontrol aplikasi kanvas dan item galeri berdasarkan nama.

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

Mengetik ekspor

Ekspor semua jenis dari akar paket:

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

Langkah berikutnya

Baca juga