Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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';