Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Power Apps Testmodul verwendet YAML-basierte Testdefinitionen, die für einen spezialisierten Testhost ausgeführt werden. Power Platform Playwright-Beispiele verwenden TypeScript und den standardmäßigen Playwright-Testläufer, sodass Sie Zugriff auf die vollständige Playwright-API, Ökosystem-Tools und CI/CD-Integrationen erhalten.
Dieser Leitfaden ordnet Test Engine-Konzepte ihren Playwright-Entsprechungen zu und führt durch ein konkretes Migrationsbeispiel.
Konzeptzuordnung
Die folgende Tabelle zeigt, wie die Konzepte der Test-Engine ihren Entsprechungen in Playwright zugeordnet werden.
| Test Engine-Konzept | Playwright-Entsprechung |
|---|---|
| YAML-Testdatei | TypeScript-Testdatei (*.test.ts) |
testSuite.testCases |
test.describe() Blöcke |
testStep |
test()-Funktion |
appLogicalName |
directUrl in AppProvider.launch() |
onTestCaseStart |
test.beforeEach() |
Assert |
von expect() aus @playwright/test |
Select (Kontrollinteraktion) |
canvasFrame.locator('[data-control-name="..."]').click() |
SetProperty |
canvasFrame.locator('input[...]').fill() |
Screenshot |
page.screenshot() oder toHaveScreenshot() |
environmentVariables |
.env Dateivariablen |
| Power Fx-Formeln in YAML | TypeScript-Ausdrücke |
Bevor Sie anfangen
Führen Sie diese Voraussetzungen aus, bevor Sie die Migration starten.
Klonen Sie das Repository und installieren Sie Abhängigkeiten:
git clone https://github.com/microsoft/power-platform-playwright-samples.git cd power-platform-playwright-samples node common/scripts/install-run-rush.js installKopieren Sie Ihre App-URL aus dem Test Engine YAML-
appLogicalNameoder dem Power Apps-Erstellungsportal.Einrichten der Authentifizierung – siehe Authentifizierungshandbuch.
Schritt 1: Identifizieren des App-Typs
Das Testmodul unterstützt Canvas-Apps. Wenn Sie migrieren:
- Canvas-Apps testen → Folgt Testen von Canvas-Apps.
- Benutzerdefinierte Seitentests → Tests für benutzerdefinierte Seiten folgen.
- Modellgesteuerte App-Tests → Dem Testen modellgesteuerter Apps folgen.
Schritt 2: Ordnen Sie Ihre Teststruktur zu
Testmodul YAML
Eine typische Test-Engine-Testdefinition sieht so aus.
testSuite:
testSuiteName: OrdersTests
testCases:
- testCaseName: CreateOrder
testSteps: |
Select(AddButton);
SetProperty(OrderNumberInput, "ORD-TEST");
Select(SaveButton);
Assert(Label1.Text = "Saved");
Playwright TypeScript-Entsprechung
Hier sehen Sie den gleichen Test, der mit Playwright und dem Power Platform-Toolkit neu geschrieben wurde.
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');
});
});
Schritt 3: Zuordnen von Steuerelementauswahlen
Das Testmodul verwendet Steuerelementnamen aus Power Apps Studio direkt in YAML. Verwenden Sie in Playwright data-control-name-Attribute mit denselben Werten.
| Testmodul | 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() |
Tipp
Um den data-control-name Wert für ein Steuerelement zu finden, öffnen Sie die App im Wiedergabemodus, öffnen Sie DevTools (F12), und prüfen Sie das Element. Der Wert entspricht dem Steuerelementnamen, den Sie in Power Apps Studio festgelegt haben.
Schritt 4: Zuordnen von Umgebungsvariablen
Das Testmodul verwendet einen environmentVariables Abschnitt in YAML. Verschieben Sie diese Werte in Ihre .env Datei:
# Test Engine YAML
environmentVariables:
- name: appUrl
value: https://apps.powerapps.com/play/...
# packages/e2e-tests/.env
CANVAS_APP_URL=https://apps.powerapps.com/play/...
Schritt 5: Einrichten von Setup und Abbau
Konvertieren Sie die Lifecycle-Hooks der Test-Engine in die integrierten Funktionen beforeEach und afterEach von 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({ ... });
});
Schritt 6: Ersetzen von Power Fx-Assertionen
Test Engine verwendet Power Fx-Ausdrücke in Assert(). Ersetzen durch Playwright-Assertionen 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() |
Wichtige Unterschiede, die beachtet werden müssen
Beachten Sie diese Verhaltensunterschiede beim Migrieren Ihrer Tests.
| Fläche | Testmodul | Playwright |
|---|---|---|
| Wartet | Automatisch (Die Test-Engine steuert das Timing) | Explizit waitFor() erforderlich |
| Galerie-Timeouts | Intern bearbeitet | Verwenden Sie ein 60-Sekunden-Timeout für Dataverse-Galerien |
| Testisolation | Jeder Test setzt den App-Zustand zurück. | Verwenden Sie beforeEach, um neu zu starten oder zur Startseite zu navigieren |
| Screenshots | Integrierter Screenshot Schritt |
page.screenshot() oder toHaveScreenshot() |
| Fehlerberichterstattung | YAML-Ebene | Playwright HTML-Bericht + Trace-Viewer |
Führen Sie Ihre migrierten Tests aus
Nachdem Sie Ihre Tests migriert haben, authentifizieren Sie sie, und führen Sie sie mithilfe dieser Befehle aus.
cd packages/e2e-tests
npm run auth:headful # authenticate
npx playwright test # run all tests
npx playwright test --ui # run with interactive UI
Behebung von Migrationsproblemen
In der folgenden Tabelle finden Sie allgemeine Migrationsprobleme und deren Lösungen.
| Symptom | Resolution |
|---|---|
| Katalog wird nicht geladen | Fügen Sie waitFor({ timeout: 60000 }) vor der Interaktion hinzu |
| Steuerelement nicht gefunden | Überprüfen Sie data-control-name in den DevTools – es könnte sich vom Power Fx-Namen unterscheiden. |
| Selektor entspricht mehreren Elementen | Verwenden Sie .filter() oder .nth(0), um die Auswahl einzuschränken. |
| Tests werden ausgeführt, die Assertion schlägt jedoch sofort fehl. | Explizite waitFor oder toBeVisible vor der Bestätigung hinzufügen |