Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa API del toolkit Playwright di Power Platform documenta classi, metodi e tipi pubblici che è possibile usare per automatizzare i test end-to-end delle app canvas e basate su modello.
AppProvider
Punto di ingresso per l'avvio di app Power Platform. Creare un'istanza una volta per ogni test, quindi chiamare launch().
class AppProvider {
constructor(page: Page, context: BrowserContext)
launch(options: AppLaunchOptions): Promise<void>
getModelDrivenAppPage(): ModelDrivenAppPage
getCanvasAppPage(): CanvasAppPage
getGenUxPage(): GenUxPage
}
AppLaunchOptions
Opzioni passate a AppProvider.launch() per configurare l'app da aprire e come.
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
Specifica il tipo di app Power Platform da avviare.
enum AppType {
Canvas = 'canvas',
ModelDriven = 'model-driven',
}
AppLaunchMode
Determina se l'app viene aperta in modalità di riproduzione o in modalità di modifica.
enum AppLaunchMode {
Play = 'play',
Edit = 'edit',
}
ModelDrivenAppPage
Restituito da AppProvider.getModelDrivenAppPage(). Fornisce l'accesso ai componenti e alla navigazione.
class ModelDrivenAppPage {
readonly grid: GridComponent
readonly form: FormComponent
readonly commanding: CommandingComponent
navigateToGridView(entityLogicalName: string): Promise<void>
navigateToFormView(entityLogicalName: string): Promise<void>
}
GridComponent
Esegue il wrapping della griglia del gruppo di disponibilità usata nelle visualizzazioni elenco basate su modello. Accesso tramite 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
Opzioni per identificare il record da aprire dalla griglia.
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
Esegue il wrapping del runtime del modulo Dynamics 365. Accesso tramite 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()
Esegue codice arbitrario nel contesto del modulo del browser con accesso completo all'API client Xrm:
const value = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_ordernumber')?.getValue()
);
Per informazioni dettagliate sull'utilizzo, vedere Test dell'API tramite il contesto del modulo .
CommandingComponent
Esegue il wrapping della barra dei comandi dell'app basata su modello. Accesso tramite ModelDrivenAppPage.commanding.
class CommandingComponent {
clickButton(ariaLabel: string): Promise<void>
clickMoreCommands(): Promise<void>
}
CanvasAppPage
Restituito da AppProvider.getCanvasAppPage(). Fornisce il localizzatore di frame iframe dell'area di disegno.
class CanvasAppPage {
getFrame(): FrameLocator
waitForLoad(controlName?: string): Promise<void>
}
GenUxPage
Restituito da AppProvider.getGenUxPage(). Fornisce interazioni con la finestra di progettazione di intelligenza artificiale genUX del portale di Power Apps Maker per la creazione, la generazione, l'ispezione e la pubblicazione di app basate su modelli da richieste di intelligenza artificiale.
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
Espone per l'iframe FrameLocator di anteprima UCI. Utilizzare questa proprietà per eseguire query direttamente sugli elementi del modulo generati:
const input = genUxPage.previewFrame.getByRole('textbox', { name: 'First Name' });
await expect(input).toBeVisible();
GenUxPage.verifyThoughtStreaming()
Verifica la presenza di indicatori di streaming GenUX temporanei, ad esempio testo pensato, pulsante Arresta e Pensieri agente. Ogni controllo è il miglior sforzo: la generazione potrebbe essere completata prima che vengano visualizzati tutti gli indicatori. L'unica asserzione hard consiste nel fatto che lo streaming è in corso o "Your page is now generated" è visibile.
GenUxPage.searchAndPlayApp()
Restituisce null quando Play è disabilitato (l'app non è ancora pubblicata) anziché generare un errore. Usare test.skip() in un null restituito:
const appPage = await genUxPage.searchAndPlayApp(appName, context);
if (!appPage) test.skip();
Funzioni di utilità
Funzioni helper autonome per attività di configurazione e configurazione comuni.
buildCanvasAppUrlFromEnv
Letture CANVAS_APP_URL dall'ambiente:
function buildCanvasAppUrlFromEnv(): string
getStorageStatePath
Restituisce il percorso del file di stato di archiviazione Power Apps per il messaggio di posta elettronica specificato:
function getStorageStatePath(email: string): string
// Returns: packages/e2e-tests/.playwright-ms-auth/state-<email>.json
ConfigHelper
Fornisce helper di configurazione, ad esempio per verificare se lo stato di archiviazione memorizzato nella cache è scaduto.
class ConfigHelper {
static checkStorageStateExpiration(
statePath: string
): { expired: boolean; expiresOn?: number }
}
Utilità del localizzatore
Metodi helper per individuare Power Apps controlli all'interno di iframe.
LocatorUtils
Metodi statici per trovare controlli app canvas e elementi della raccolta in base al nome.
class LocatorUtils {
static getByControlName(frame: FrameLocator, controlName: string): Locator
static getGalleryItem(frame: FrameLocator, titleText: string): Locator
}
Esportazioni dei tipi
Esportare tutti i tipi dalla radice del pacchetto:
import {
AppProvider,
AppType,
AppLaunchMode,
AppLaunchOptions,
ModelDrivenAppPage,
GridComponent,
FormComponent,
CommandingComponent,
CanvasAppPage,
GenUxPage,
buildCanvasAppUrlFromEnv,
getStorageStatePath,
ConfigHelper,
LocatorUtils,
} from 'power-platform-playwright-toolkit';