एपीआई संदर्भ

यह Power Platform Playwright टूलकिट API संदर्भ सार्वजनिक वर्गों, विधियों और प्रकारों के दस्तावेज़ों का उपयोग आप कैनवास और मॉडल-चालित ऐप्स के एंड-टू-एंड परीक्षण को स्वचालित करने के लिए कर सकते हैं।

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 क्लाइंट API तक पूर्ण पहुँच के साथ ब्राउज़र के प्रपत्र संदर्भ में मनमाना कोड चलाता है:

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

विस्तृत उपयोग के लिए प्रपत्र संदर्भ के माध्यम से एपीआई परीक्षण देखें।


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() AI प्रॉम्प्ट से मॉडल-संचालित ऐप्स बनाने, जनरेट करने, निरीक्षण करने और प्रकाशित करने के लिए Power Apps Maker Portal GenUX 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

UCI पूर्वावलोकन iframe के लिए उजागर करता है FrameLocator । जनरेट किए गए प्रपत्र तत्वों को सीधे क्वेरी करने के लिए इस गुण का उपयोग करें:

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

GenUxPage.verifyThoughtStreaming()

क्षणिक GenUX स्ट्रीमिंग संकेतकों की जाँच करता है, जैसे कि विचार पाठ, स्टॉप बटन और एजेंट विचार। प्रत्येक चेक सर्वोत्तम-प्रयास है - सभी संकेतक दिखाई देने से पहले पीढ़ी पूरी हो सकती है। एकमात्र कठिन दावा यह है कि या तो स्ट्रीमिंग प्रगति पर है या दिखाई "Your page is now generated" दे रही है।

GenUxPage.searchAndPlayApp()

कोई गड़बड़ी फेंकने के बजाय Play अक्षम होने पर (ऐप्लिकेशन अभी तक प्रकाशित नहीं हुआ है) पर वापस आ जाता null है. वापसी पर 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 }
}

लोकेटर उपयोगिताएँ

iframes के भीतर Power Apps नियंत्रणों का पता लगाने के लिए सहायक विधियाँ.

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';

अगले कदम

भी देखें