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.
Gen UX-Apps sind KI-generierte Power Apps, die durch die Erfahrung mit natürlicher Sprache in Power Apps erstellt werden. Sie verwenden dieselbe Canvas-Runtime wie von Hand erstellte Canvas-Apps, sodass die gleiche iframe-Bereichsdefinition und data-control-name-muster gelten. Die GenUxPage Klasse stellt Hilfsprogramme bereit, die für die generierte Steuerelementstruktur abgestimmt sind.
Unterschiede zwischen Gen-UX-Apps und Canvas-Apps
Gen UX-Apps teilen die Canvas-Laufzeit und den iframe[name="fullscreen-app-host"] Host-Frame. Die wichtigsten Unterschiede sind:
- Steuerelementnamen werden automatisch generiert (z. B.
Button1,TextInput1) und können sich ändern, wenn Sie die App neu generieren. - Die KI-Eingabeaufforderung steuert das App-Layout, sodass die Struktur zwischen Apps variiert.
- Die
GenUxPageKlasse macht Hilfsprogramme verfügbar, die mit semantischen Rollen und ARIA-Bezeichnungen arbeiten, anstatt Namen zu steuern, wodurch Tests stabiler für die Regeneration gemacht werden.
Starten einer Gen-UX-App
Verwenden Sie die AppProvider klasse, um eine Gen-UX-App im Abspielmodus zu starten, und dabei eine direkte URL übergeben, um das Maker-Portal zu überspringen und direkt mit der Canvas-Runtime zu verbinden.
import { test, expect } from '@playwright/test';
import {
AppProvider,
AppType,
AppLaunchMode,
buildCanvasAppUrlFromEnv,
} from 'power-platform-playwright-toolkit';
const GEN_UX_APP_URL = buildCanvasAppUrlFromEnv();
test.beforeEach(async ({ page, context }) => {
const app = new AppProvider(page, context);
await app.launch({
app: 'My AI App',
type: AppType.Canvas,
mode: AppLaunchMode.Play,
skipMakerPortal: true,
directUrl: GEN_UX_APP_URL,
});
});
Tipp
Verwenden Sie skipMakerPortal: true mit directUrl, um Power Apps zu umgehen und die Startzeit um 10 bis 20 Sekunden zu reduzieren.
Bereichslocatoren für den Canvasframe
Alle Interaktionen auf das iFrame der Zeichenfläche beschränken.
const canvasFrame = page.frameLocator('iframe[name="fullscreen-app-host"]');
Warten, bis die App geladen wird
Gen-UX-Apps können 30 bis 60 Sekunden dauern, um Dataverse-Daten zu laden. Warten Sie vor der Interaktion auf ein bekanntes Element:
// Wait for a gallery or any visible UI element
await canvasFrame
.locator('[data-control-part="gallery-item"]')
.first()
.waitFor({ state: 'visible', timeout: 60000 });
Interagieren mit Steuerelementen mit der ARIA-Bezeichnung
Gen-UX-Apps generieren Steuerelemente mit von Ihrer Eingabeaufforderung abgeleiteten ARIA-Bezeichnungen. Verwenden Sie ARIA-Bezeichnungsselektoren, um die Resilienz zu erhöhen:
Ausfüllen einer Texteingabe
Zieltext-Eingaben anhand ihres aria-label Attributs, das dem Dataverse-Spaltenanzeigennamen entspricht, und verwenden Sie die Playwright-Methode fill(), um Werte einzugeben.
await canvasFrame.locator('input[aria-label="Name"]').fill('Contoso Ltd');
await canvasFrame.locator('input[aria-label="Phone"]').fill('555-9000');
Klicken Sie auf eine Schaltfläche
Suchen Sie Schaltflächen, indem Sie den role="button"-Selektor mit dem von der KI basierend auf Ihrem Prompt zugewiesenen aria-label kombinieren.
await canvasFrame.locator('[role="button"][aria-label="Save"]').click();
await canvasFrame.locator('[role="button"][aria-label="New record"]').click();
Aus einer Dropdownliste auswählen
Klicken Sie auf das Dropdown, um die Optionsliste zu erweitern, und wählen Sie dann die gewünschte Option aus, indem Sie den sichtbaren Text abgleichen.
const dropdown = canvasFrame.locator('[aria-label="Category"]');
await dropdown.click();
await canvasFrame.locator('[role="option"]:has-text("Enterprise")').click();
Arbeiten mit Galerien
Gen-UX-Kataloge verwenden dieselben Attribute wie Canvas-App-Kataloge:
const gallery = canvasFrame.locator('[data-control-part="gallery-item"]');
// Count items
const count = await gallery.count();
expect(count).toBeGreaterThan(0);
// Filter by text content
const item = gallery.filter({ hasText: 'Contoso Ltd' });
await item.waitFor({ state: 'visible', timeout: 30000 });
await item.click();
Vollständiges Testbeispiel: Erstellen und Finden eines Datensatzes
Der folgende End-to-End-Test startet eine Gen-UX-App, erstellt einen neuen Datensatz über das Formular und überprüft, ob er im Katalog angezeigt wird.
import { test, expect } from '@playwright/test';
import { AppProvider, AppType, AppLaunchMode, buildCanvasAppUrlFromEnv } from 'power-platform-playwright-toolkit';
const GEN_UX_APP_URL = buildCanvasAppUrlFromEnv();
test('should create a new record and find it in the list', async ({ page, context }) => {
const app = new AppProvider(page, context);
await app.launch({
app: 'My AI App',
type: AppType.Canvas,
mode: AppLaunchMode.Play,
skipMakerPortal: true,
directUrl: GEN_UX_APP_URL,
});
const canvasFrame = page.frameLocator('iframe[name="fullscreen-app-host"]');
// Wait for the gallery to load
await canvasFrame
.locator('[data-control-part="gallery-item"]')
.first()
.waitFor({ state: 'visible', timeout: 60000 });
// Click New record
await canvasFrame.locator('[role="button"][aria-label="New record"]').click();
// Fill the form
const accountName = `AI Test ${Date.now()}`;
await canvasFrame.locator('input[aria-label="Name"]').fill(accountName);
await canvasFrame.locator('input[aria-label="Phone"]').fill('555-1234');
// Save
await canvasFrame.locator('[role="button"][aria-label="Save"]').click();
await page.waitForTimeout(3000); // allow Dataverse write
// Verify the new record appears in the gallery
const newItem = canvasFrame
.locator('[data-control-part="gallery-item"]')
.filter({ hasText: accountName });
await expect(newItem).toBeVisible({ timeout: 30000 });
});
Ermitteln der generierten Steuerelementnamen
Gen-UX-Steuerelementnamen ändern sich, wenn Sie die App neu generieren. So suchen Sie nach aktuellen Steuerelementnamen:
- Öffnen Sie die App im Wiedergabemodus in einem Browser.
- Öffnen Sie Browser DevTools (F12).
- Verwenden Sie den Inspektor , um mit dem Mauszeiger auf ein Steuerelement zu zeigen.
- Suchen Sie nach
data-control-namein den Attributen des Elements.
Tipp
Bevorzugen Sie aria-label und rollenbasierte Selektoren vor data-control-name für Gen-UX-Apps. ARIA-Bezeichnungen stammen aus ihren Dataverse-Spaltenanzeigenamen und ändern sich nicht, wenn Sie die App neu generieren.
Authentifizierung
Gen-UX-Apps verwenden die Domäne Power Apps. Verwenden Sie den Standardspeicherstatus:
import { getStorageStatePath } from 'power-platform-playwright-toolkit';
test.use({
storageState: getStorageStatePath(process.env.MS_AUTH_EMAIL!),
});