此 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()
);
有关详细用法,请参阅 通过表单上下文进行 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公开 UCI 预览版 iframe。 使用此属性直接查询生成的表单元素:
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(尚未发布应用)而不是引发错误。 在返回时null使用test.skip():
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 }
}
定位符实用工具
用于在 iframe 中查找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';