Freigeben über


Migration von Power Apps Test Engine

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.

  1. 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 install
    
  2. Kopieren Sie Ihre App-URL aus dem Test Engine YAML-appLogicalName oder dem Power Apps-Erstellungsportal.

  3. Einrichten der Authentifizierung – siehe Authentifizierungshandbuch.

Schritt 1: Identifizieren des App-Typs

Das Testmodul unterstützt Canvas-Apps. Wenn Sie migrieren:

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

Nächste Schritte

Siehe auch