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.
Die FormComponent.execute()-Methode führt beliebiges JavaScript innerhalb des Dynamics 365 Formularkontexts direkt für die Xrm-API aus. Dieser Ansatz ermöglicht einen Hybridtestansatz. Verwenden Sie Playwright, um zu einem Datensatz zu navigieren, und verwenden Sie execute() dann, um Daten programmgesteuert zu überprüfen oder zu bearbeiten. Dieser Ansatz ersetzt UI-Interaktionen, die langsam oder unzuverlässig sind.
So funktioniert es
Wenn Sie einen modellgesteuerten App-Eintrag im Browser öffnen, ist das Xrm-Objekt verfügbar.window.Xrm Die execute() Methode überbrückt den Playwright Node.js Kontext und den Browserseitenkontext. Sie fügt Ihre Funktion in den Browser ein und gibt das Ergebnis zurück:
const result = await modelDrivenApp.form.execute(async (formContext) => {
// This code runs inside the browser, with access to the full Xrm API
return formContext.getAttribute('nwind_ordernumber')?.getValue();
});
console.log(`Order number from Xrm: ${result}`);
formContext ist das Standardobjekt Dynamics 365 Xrm.Form.FormContext. Sie können eine beliebige Xrm-Client-API-Methode verwenden.
Lesen von Feldwerten über Xrm
Dient execute() zum Lesen von Feldwerten, ohne sich auf DOM-Selektoren zu verlassen:
// Read a text field
const orderNumber = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_ordernumber')?.getValue()
);
// Read a lookup field
const customer = await mda.form.execute((ctx) => {
const lookup = ctx.getAttribute('nwind_customerid')?.getValue();
return lookup?.[0]?.name ?? null;
});
// Read a choice/option set
const statusCode = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_orderstatusid')?.getValue()
);
Tipp
Das Lesen über die Xrm-API ist zuverlässiger als das Lesen von DOM-Eingabewerten. Die Xrm-API gibt unabhängig davon, wie das Feld gerendert wird, den internen typierten Wert zurück.
Schreiben von Feldwerten über Xrm
Programmgesteuertes Festlegen von Feldwerten ohne Ausfüllen von Eingabeelementen:
await mda.form.execute((ctx) => {
ctx.getAttribute('nwind_ordernumber')?.setValue('ORD-API-001');
ctx.getAttribute('nwind_notes')?.setValue('Updated via Xrm API');
});
Hinweis
Das Festlegen von Werten über execute() umgeht Ereignisse der Browsereingabe. Bei Feldern mit onChange Geschäftsregeln entspricht dieser Ansatz dem, was ein Plug-In oder Skript tun würde. Verwenden Sie mda.form.setAttribute() für Felder, die von Browsereingabefokus oder Unschärfeereignissen abhängen, welche den UI-Pfad auslösen.
Überprüfen von Geschäftslogikregeln
Testen Sie, dass Geschäftsregeln auf Feldebene oder Formularebene ordnungsgemäß ausgelöst werden.
// Open a record
await mda.grid.openRecord({ rowNumber: 0 });
// Trigger a field change
await mda.form.setAttribute('nwind_orderstatusid', 'Shipped');
// Validate that a business rule made the tracking field required
const requiredLevel = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_trackingnumber')?.getRequiredLevel()
);
expect(requiredLevel).toBe('required');
Überprüfung der Gültigkeit und des Bearbeitungszustands des Formulars
Verwenden Sie die isDirty(), isValid() und save() Methoden, um zu überprüfen, ob Formularänderungen ordnungsgemäß nachverfolgt werden und dass die Überprüfung vor und nach dem Speichern bestanden wird.
// After making changes, verify the form is dirty
const isDirty = await mda.form.isDirty();
expect(isDirty).toBe(true);
// Save and verify no validation errors
await mda.form.save();
expect(await mda.form.isValid()).toBe(true);
expect(await mda.form.isDirty()).toBe(false);
Ausführen von Xrm WebApi-Aufrufen
Die vollständige Xrm.WebApi ist innerhalb execute() verfügbar. Verwenden Sie sie, um Dataverse-Datensätze direkt abzufragen oder zu verändern.
// Query Dataverse records without navigating the grid
const result = await mda.form.execute(async (formContext) => {
const response = await (window as any).Xrm.WebApi.retrieveMultipleRecords(
'nwind_orders',
'?$filter=nwind_orderstatus eq 1&$select=nwind_ordernumber&$top=5'
);
return response.entities.map((e: any) => e.nwind_ordernumber);
});
expect(result.length).toBeGreaterThan(0);
Von Bedeutung
Xrm.WebApi Aufrufe werden im Browserkontext ausgeführt und unterliegen Datenverse-API-Grenzwerten und der Sicherheitsrolle des Testbenutzers. Sie zählen für Ihr API-Aufrufkontingent.
Test von Plugin-Nebenwirkungen
Verwenden Sie execute() nach dem Speichern eines Datensatzes, um zu überprüfen, ob ein Plug-In ein verwandtes Feld ordnungsgemäß aktualisiert hat.
// Create a new order via UI
await mda.navigateToFormView('nwind_orders');
await page.locator('input[data-id="nwind_ordernumber.fieldControl-text-box-text"]').fill('ORD-PLUGIN-TEST');
await mda.form.save();
// Wait for plugin async processing
await page.waitForTimeout(3000);
// Verify the plugin set the calculated total
const calculatedTotal = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_calculatedtotal')?.getValue()
);
expect(calculatedTotal).toBeGreaterThan(0);
Kombinieren der UI-Navigation mit API-Assertionen
Ein gängiges Muster besteht darin, die Navigation über die Benutzeroberfläche zu steuern und dann den Zustand über die API zu überprüfen. Im folgenden Beispiel wird ein Auftrag aus dem Raster geöffnet, auf die Schaltfläche Bestellung senden geklickt, und anschließend wird die Xrm-API verwendet, um zu bestätigen, dass der Auftragsstatus auf Ausstehend aktualisiert wurde.
test('submit order sets status to Pending', async ({ page, context }) => {
const app = new AppProvider(page, context);
await app.launch({ ... });
const mda = app.getModelDrivenAppPage();
// Navigate to the order via the grid (UI path)
await mda.navigateToGridView('nwind_orders');
await mda.grid.filterByKeyword('ORD-001');
await mda.grid.waitForGridLoad();
await mda.grid.openRecord({ rowNumber: 0 });
// Click Submit via the command bar (UI path)
await mda.commanding.clickButton('Submit Order');
await page.waitForTimeout(2000);
// Validate the status via Xrm API (API assertion)
const status = await mda.form.execute(
(ctx) => ctx.getAttribute('nwind_orderstatusid')?.getValue()
);
expect(status).toBe(100000001); // Pending option set value
});
Referenz zur Formularkontext-API
Der rückruf execute() empfängt ein Standardkontextobjekt Dynamics 365 form. Schlüsselmethoden:
| Methode | Beschreibung |
|---|---|
getAttribute(name) |
Abrufen eines Formularattributes anhand des Schemanamens |
getAttribute(name).getValue() |
Lesen des aktuellen Feldwerts |
getAttribute(name).setValue(v) |
Festlegen des Feldwerts |
getAttribute(name).getRequiredLevel() |
Lesen 'none', 'recommended' oder 'required' |
getAttribute(name).setRequiredLevel(level) |
Festlegen der erforderlichen Ebene |
getControl(name).setVisible(bool) |
Ein- oder Ausblenden eines Felds |
getControl(name).setDisabled(bool) |
Aktivieren oder Deaktivieren eines Felds |
ui.tabs.get(name).setVisible(bool) |
Einen Tab anzeigen oder ausblenden |
data.entity.getId() |
Holen Sie sich die aktuelle GUID des Datensatzes |
data.entity.getEntityName() |
Abrufen des logischen Entitätsnamens |
data.save() |
Programmgesteuertes Speichern des Formulars |
Die vollständige Xrm-Client-API-Referenz finden Sie unter Microsoft Dataverse Client-API-Referenz.