Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Power Apps Moteur de test utilise des définitions de test basées sur YAML qui s’exécutent sur un hôte de test spécialisé. Les exemples Playwright power Platform utilisent TypeScript et l’exécuteur de test Playwright standard, ce qui vous donne accès à l’API Playwright complète, aux outils de l’écosystème et aux intégrations CI/CD.
Ce guide correspond les concepts du moteur de test à leurs équivalents Playwright et décrit un exemple de migration concret.
Mappage de concepts
Le tableau suivant montre comment les concepts du moteur de tests sont mappés à leurs équivalents Playwright.
| Concept du moteur de test | Équivalent Playwright |
|---|---|
| Fichier de test YAML | Fichier de test TypeScript (*.test.ts) |
testSuite.testCases |
test.describe() Blocs |
testStep |
test() Fonction |
appLogicalName |
directUrl dans AppProvider.launch() |
onTestCaseStart |
test.beforeEach() |
Assert |
expect() à partir de @playwright/test |
Select (interaction de contrôle) |
canvasFrame.locator('[data-control-name="..."]').click() |
SetProperty |
canvasFrame.locator('input[...]').fill() |
Screenshot |
page.screenshot() ou toHaveScreenshot() |
environmentVariables |
.env variables de fichier |
| Formules Power Fx dans YAML | Expressions TypeScript |
Avant de commencer
Remplissez ces conditions préalables avant de commencer la migration.
Clonez le référentiel et installez les dépendances :
git clone https://github.com/microsoft/power-platform-playwright-samples.git cd power-platform-playwright-samples node common/scripts/install-run-rush.js installCopiez l’URL de votre application à partir du moteur de test YAML
appLogicalNameou du portail de création de Power Apps.Configurer l’authentification : consultez le guide d’authentification.
Étape 1 : Identifier votre type d’application
Le moteur de test prend en charge les applications Canvas. Si vous migrez :
- Tests des applications canevas → Suivez Tester les applications canevas.
- Tests de page personnalisés → Suivre les pages personnalisées de test.
- Tests d'applications pilotées par modèle → Suivez les tests d'applications pilotées par modèle.
Étape 2 : Mapper votre structure de test
YAML du moteur de test
Une définition typique de test de Test Engine ressemble à ceci.
testSuite:
testSuiteName: OrdersTests
testCases:
- testCaseName: CreateOrder
testSteps: |
Select(AddButton);
SetProperty(OrderNumberInput, "ORD-TEST");
Select(SaveButton);
Assert(Label1.Text = "Saved");
Équivalent TypeScript de Playwright
Voici le même test réécrit à l’aide de Playwright et du kit de ressources Power Platform.
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');
});
});
Étape 3 : Sélecteurs Map Control
Le moteur de test utilise des noms de contrôle de Power Apps Studio directement dans YAML. Dans Playwright, utilisez data-control-name des attributs avec les mêmes valeurs :
| Moteur de test | 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() |
Conseil / Astuce
Pour rechercher la data-control-name valeur d’un contrôle, ouvrez l’application en mode lecture, ouvrez DevTools (F12) et inspectez l’élément. La valeur correspond au nom de contrôle que vous avez défini dans Power Apps Studio.
Étape 4 : Mapper des variables d’environnement
Le moteur de test utilise une environmentVariables section dans YAML. Déplacez ces valeurs vers votre .env fichier :
# Test Engine YAML
environmentVariables:
- name: appUrl
value: https://apps.powerapps.com/play/...
# packages/e2e-tests/.env
CANVAS_APP_URL=https://apps.powerapps.com/play/...
Étape 5 : Mapper la configuration et le nettoyage
Convertissez les hooks de cycle de vie Test Engine en fonctions intégrées beforeEach et 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({ ... });
});
Étape 6 : Remplacer les assertions Power Fx
Le moteur de test utilise des expressions Power Fx dans Assert(). Remplacez par les assertions 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() |
Différences clés à connaître
Gardez ces différences comportementales à l’esprit lorsque vous migrez vos tests.
| Domaine | Moteur de test | Playwright |
|---|---|---|
| Attend | Automatique (le moteur de test gère le minutage) | Utilisation explicite de waitFor() requise |
| Délais d’expiration de la galerie | Géré en interne | Utiliser un délai d’expiration de 60 secondes pour les galeries Dataverse |
| Isolation des tests | Chaque test réinitialise l’état de l’application | Utiliser beforeEach pour relancer ou naviguer vers la page d’accueil |
| Captures d’écran | Étape Screenshot intégrée |
page.screenshot() ou toHaveScreenshot() |
| Rapport d’erreurs | Niveau YAML | Rapport HTML Playwright + visionneuse de traces |
Exécutez vos tests migrés
Après avoir migré vos tests, authentifiez-les et exécutez-les à l’aide de ces commandes.
cd packages/e2e-tests
npm run auth:headful # authenticate
npx playwright test # run all tests
npx playwright test --ui # run with interactive UI
Résoudre les problèmes liés à la migration
Reportez-vous au tableau suivant pour connaître les problèmes de migration courants et leurs solutions.
| Symptôme | Résolution |
|---|---|
| La galerie ne se charge pas | Ajouter waitFor({ timeout: 60000 }) avant d’interagir |
| Élément de contrôle introuvable | Vérifier data-control-name dans DevTools : il peut différer du nom Power Fx |
| Le sélecteur correspond à plusieurs éléments | Utiliser .filter() ou .nth(0) limiter la sélection |
| Les tests s’exécutent mais l’assertion échoue immédiatement | Ajouter de manière explicite waitFor ou toBeVisible avant l’assertion |