Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Power Apps motor de pruebas usa definiciones de prueba basadas en YAML que se ejecutan en un host de prueba especializado. Los ejemplos de Power Platform Playwright usan TypeScript y el ejecutor de pruebas estándar de Playwright, lo que proporciona acceso a la API completa de Playwright, las herramientas del ecosistema y las integraciones de CI/CD.
En esta guía se asignan los conceptos del motor de pruebas a sus equivalentes de Playwright y se recorre un ejemplo concreto de migración.
Mapa conceptual
En la tabla siguiente se muestra cómo se asignan los conceptos del entorno de pruebas a sus equivalentes de Playwright.
| Concepto del motor de pruebas | Equivalente de playwright |
|---|---|
| Archivo de prueba de YAML | Archivo de prueba de TypeScript (*.test.ts) |
testSuite.testCases |
test.describe() bloques |
testStep |
test() Función |
appLogicalName |
directUrl en AppProvider.launch() |
onTestCaseStart |
test.beforeEach() |
Assert |
expect() de @playwright/test |
Select (interacción de control) |
canvasFrame.locator('[data-control-name="..."]').click() |
SetProperty |
canvasFrame.locator('input[...]').fill() |
Screenshot |
page.screenshot() o toHaveScreenshot() |
environmentVariables |
.env variables de archivo |
| Fórmulas de Power Fx en YAML | Expresiones de TypeScript |
Antes de empezar
Complete estos requisitos previos antes de iniciar la migración.
Clone el repositorio e instale las dependencias:
git clone https://github.com/microsoft/power-platform-playwright-samples.git cd power-platform-playwright-samples node common/scripts/install-run-rush.js installCopie la dirección URL de la aplicación desde el YAML del motor de pruebas
appLogicalNameo el portal de creación de Power Apps.Configuración de la autenticación: consulte la guía de autenticación.
Paso 1: Identificar el tipo de aplicación
Test Engine admite aplicaciones basadas en lienzo. Si va a migrar:
- Pruebas de aplicaciones de lienzo → Seguir Probar aplicaciones de lienzo.
- Pruebas de página personalizadas → Seguir probar páginas personalizadas.
- Pruebas de aplicaciones basadas en modelos → seguir Probar aplicaciones basadas en modelos.
Paso 2: Mapear la estructura de la prueba
Motor de pruebas YAML
Una definición de prueba típica del Motor de Pruebas se ve así.
testSuite:
testSuiteName: OrdersTests
testCases:
- testCaseName: CreateOrder
testSteps: |
Select(AddButton);
SetProperty(OrderNumberInput, "ORD-TEST");
Select(SaveButton);
Assert(Label1.Text = "Saved");
Equivalente de TypeScript de Playwright
Esta es la misma prueba reescrita mediante Playwright y Power Platform Toolkit.
import { test, expect } from '@playwright/test';
import { AppProvider, AppType, AppLaunchMode, buildCanvasAppUrlFromEnv } from 'power-platform-playwright-toolkit';
test.describe('OrdersTests', () => {
test('CreateOrder', async ({ page, context }) => {
const app = new AppProvider(page, context);
await app.launch({
app: 'Orders App',
type: AppType.Canvas,
mode: AppLaunchMode.Play,
skipMakerPortal: true,
directUrl: buildCanvasAppUrlFromEnv(),
});
const canvasFrame = page.frameLocator('iframe[name="fullscreen-app-host"]');
// Wait for app to load
await canvasFrame
.locator('[data-control-part="gallery-item"]')
.first()
.waitFor({ state: 'visible', timeout: 60000 });
// Select(AddButton)
await canvasFrame.locator('[data-control-name="AddButton"] [role="button"]').click();
// SetProperty(OrderNumberInput, "ORD-TEST")
await canvasFrame.locator('input[aria-label="Order Number"]').fill('ORD-TEST');
// Select(SaveButton)
await canvasFrame.locator('[data-control-name="SaveButton"] [role="button"]').click();
// Assert(Label1.Text = "Saved")
await expect(canvasFrame.locator('[data-control-name="Label1"]')).toHaveText('Saved');
});
});
Paso 3: Selectores de control de mapa
Test Engine usa nombres de control de Power Apps Studio directamente en YAML. En Playwright, usa los atributos data-control-name con los mismos valores:
| Motor de pruebas | Playwright |
|---|---|
Select(MyButton) |
canvasFrame.locator('[data-control-name="MyButton"] [role="button"]').click() |
SetProperty(MyInput, "text") |
canvasFrame.locator('input[aria-label="My Label"]').fill("text") |
Assert(MyLabel.Text = "x") |
expect(canvasFrame.locator('[data-control-name="MyLabel"]')).toHaveText("x") |
Select(GalleryItem) |
canvasFrame.locator('[data-control-part="gallery-item"]').filter({ hasText: 'x' }).click() |
Sugerencia
Para buscar el data-control-name valor de un control, abra la aplicación en modo de reproducción, abra DevTools (F12) e inspeccione el elemento. El valor coincide con el nombre de control establecido en Power Apps Studio.
Paso 4: Asignar variables de entorno
El motor de pruebas usa una environmentVariables sección en YAML. Mueva estos valores al .env archivo:
# Test Engine YAML
environmentVariables:
- name: appUrl
value: https://apps.powerapps.com/play/...
# packages/e2e-tests/.env
CANVAS_APP_URL=https://apps.powerapps.com/play/...
Paso 5: Configuración y desmontaje del mapa
Convierta los hooks del ciclo de vida del motor de prueba a las funciones integradas beforeEach y afterEach de Playwright.
# Test Engine
testSuite:
onTestCaseStart: |
Navigate(HomeScreen);
// Playwright
test.beforeEach(async ({ page, context }) => {
// Re-launch the app for each test (equivalent to onTestCaseStart navigation)
const app = new AppProvider(page, context);
await app.launch({ ... });
});
Paso 6: Reemplazar aserciones de Power Fx
Test Engine usa expresiones de Power Fx en Assert(). Reemplace por aserciones de Playwright expect() :
| Power Fx | Playwright |
|---|---|
Assert(Label1.Text = "Done") |
expect(frame.locator('[data-control-name="Label1"]')).toHaveText('Done') |
Assert(CountRows(Gallery1.AllItems) > 0) |
expect(await frame.locator('[data-control-part="gallery-item"]').count()).toBeGreaterThan(0) |
Assert(IsVisible(ErrorLabel)) |
expect(frame.locator('[data-control-name="ErrorLabel"]')).toBeVisible() |
Assert(!IsVisible(Spinner)) |
expect(frame.locator('[data-control-name="Spinner"]')).not.toBeVisible() |
Diferencias clave a tener en cuenta
Tenga en cuenta estas diferencias en el comportamiento a medida que migre sus pruebas.
| Area | Motor de pruebas | Playwright |
|---|---|---|
| Esperas | Automático (motor de pruebas controla el tiempo) | Se requiere waitFor() explícitamente |
| Tiempos de espera de la galería | Gestionado internamente | Uso del tiempo de espera de 60 segundos para galerías de Dataverse |
| Aislamiento de prueba | Cada prueba restablece el estado de la aplicación | Usa beforeEach para volver a iniciar o navegar a la página de inicio |
| Capturas de pantalla | Paso integrado Screenshot |
page.screenshot() o toHaveScreenshot() |
| Informes de errores | Nivel de YAML | Informe HTML de Playwright + visor de seguimiento |
Ejecución de las pruebas migradas
Después de migrar las pruebas, autentíquelas y ejecútelas mediante estos comandos.
cd packages/e2e-tests
npm run auth:headful # authenticate
npx playwright test # run all tests
npx playwright test --ui # run with interactive UI
Solución de problemas de migración
Consulte la tabla siguiente para conocer los problemas comunes de migración y sus soluciones.
| Síntoma | Resolution |
|---|---|
| La galería no se carga | Agregar waitFor({ timeout: 60000 }) antes de interactuar |
| Control no encontrado | Comprobar data-control-name en DevTools: puede diferir del nombre de Power Fx |
| Selector coincide con varios elementos | Usar .filter() o .nth(0) para restringir la selección |
| Las pruebas se ejecutan, pero la aserción falla inmediatamente | Agregar explícito waitFor o toBeVisible antes de hacer una aserción |