การอ้างอิง API

ชุดเครื่องมือ Power Platform Playwright นี้ API อ้างอิงเอกสารระดับชั้นสาธารณะ วิธีการ และประเภทที่คุณสามารถใช้เพื่อทําให้การทดสอบแบบ end-to-end เป็นอัตโนมัติสําหรับพื้นที่ทํางานและแอปที่ขับเคลื่อนด้วยแบบจําลอง

AppProvider

จุดเริ่มต้นสําหรับการเปิดใช้งานแอป Power Platform สร้างอินสแตนซ์หนึ่งครั้งต่อการทดสอบ จากนั้นเรียกใช้launch()

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

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

AppLaunchOptions

ตัวเลือกที่ส่งผ่านเพื่อ AppProvider.launch() กําหนดค่าว่าจะเปิดแอปใดและอย่างไร

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

ระบุชนิดของแอป Power Platform ที่จะเปิดใช้งาน

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

AppLaunchMode

กําหนดว่าแอปเปิดในโหมดเล่นหรือโหมดแก้ไข

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

ModelDrivenAppPage

ส่งกลับโดยAppProvider.getModelDrivenAppPage() ให้การนําทางและการเข้าถึงคอมโพเนนต์

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

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

GridComponent

ตัด เส้นตาราง AG ที่ใช้ในมุมมองรายการแบบจําลองข้อมูล เข้าถึงผ่านทาง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

ตัวเลือกสําหรับการระบุเรกคอร์ดที่จะเปิดจากตาราง

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

ครอบ Dynamics 365 รันไทม์ของฟอร์ม เข้าถึงผ่านทาง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()

เรียกใช้โค้ดตามอําเภอใจในบริบทฟอร์มของเบราว์เซอร์ด้วยการเข้าถึง Xrm Client API เต็มรูปแบบ:

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

ดู การทดสอบ API ผ่านบริบทฟอร์ม สําหรับการใช้งานโดยละเอียด


CommandingComponent

ครอบแถบคําสั่งของแอปแบบจําลอง เข้าถึงผ่านทางModelDrivenAppPage.commanding

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

CanvasAppPage

ส่งกลับโดยAppProvider.getCanvasAppPage() ให้ตัวระบุเฟรม iframe ของพื้นที่ทํางาน

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

GenUxPage

ส่งกลับโดยAppProvider.getGenUxPage() ให้การโต้ตอบกับตัวออกแบบ Power Apps Maker Portal GenUX AI สําหรับการสร้าง สร้าง ตรวจสอบ และการเผยแพร่แอปที่ขับเคลื่อนด้วยแบบจําลองจากพร้อมท์ 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 สําหรับ iframe การแสดงตัวอย่าง UCI ใช้คุณสมบัตินี้เพื่อคิวรีองค์ประกอบของฟอร์มที่สร้างขึ้นโดยตรง:

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

GenUxPage.verifyThoughtStreaming()

ตรวจสอบตัวบ่งชี้การสตรีม GenUX ชั่วคราว เช่น ข้อความคิด ปุ่มหยุด และความคิดตัวแทน การตรวจสอบแต่ละครั้งคือความพยายามอย่างดีที่สุด - การสร้างอาจเสร็จสมบูรณ์ก่อนที่ตัวบ่งชี้ทั้งหมดจะปรากฏขึ้น การยืนยันอย่างเดียวคือการสตรีมอยู่ในระหว่างดําเนินการหรือ "Your page is now generated" มองเห็นได้

GenUxPage.searchAndPlayApp()

ส่งกลับ null เมื่อปิดใช้งาน Play (ยังไม่ได้เผยแพร่แอป) แทนที่จะแสดงข้อผิดพลาด ใช้ test.skip() บนการ null ส่งกลับ:

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

ฟังก์ชันยูทิลิตี้

ฟังก์ชันตัวช่วยเหลือแบบสแตนด์อโลนสําหรับงานการตั้งค่าและการกําหนดค่าทั่วไป

buildCanvasAppUrlFromEnv

CANVAS_APP_URLอ่านจากสภาพแวดล้อม:

function buildCanvasAppUrlFromEnv(): string

getStorageStatePath

แสดงเส้นทางไปยังไฟล์สถานะที่เก็บข้อมูล Power Apps สําหรับอีเมลที่กําหนด:

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

ConfigHelper

มีตัวช่วยเหลือการกําหนดค่า เช่น การตรวจสอบว่าสถานะที่เก็บข้อมูลที่แคชไว้หมดอายุแล้วหรือไม่

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

โปรแกรมค้นหา

วิธีการของผู้ช่วยเหลือสําหรับการค้นหา Power Apps ตัวควบคุมภายใน iframes

LocatorUtils

วิธีการแบบคงที่สําหรับการค้นหาตัวควบคุมแอปพื้นที่ทํางานและรายการแกลเลอรีตามชื่อ

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

การส่งออกชนิด

ส่งออกชนิดทั้งหมดจากรากของแพคเกจ:

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

ขั้นตอนถัดไป

ดูเพิ่มเติมที่