Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El método FormComponent.execute() ejecuta JavaScript arbitrario dentro del contexto de formulario en Dynamics 365, directamente contra la API Xrm. Este enfoque habilita un enfoque de prueba híbrida. Utilice Playwright para navegar a un registro y, a continuación, use execute() para validar o manipular datos programáticamente. Este enfoque reemplaza las interacciones de la interfaz de usuario que son lentas o no confiables.
Cómo funciona
Al abrir un registro de aplicación controlado por modelos en el explorador, el objeto Xrm está disponible en window.Xrm. El execute() método puentea el contexto de Playwright Node.js y el contexto de la página del explorador. Inserta la función en el explorador y devuelve el resultado:
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 es el objeto Dynamics 365 Xrm.Form.FormContext estándar. Puede usar cualquier método de API de cliente Xrm.
Leer valores de campo mediante Xrm
Use execute() para leer valores de campo sin depender de selectores DOM:
// 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()
);
Sugerencia
Leer a través de la API Xrm es más confiable que leer valores de entrada DOM. La API Xrm devuelve el valor tipado internamente independientemente de cómo se representa el campo.
Escribir valores de campo mediante Xrm
Establezca los valores de campo mediante programación sin rellenar los elementos de entrada:
await mda.form.execute((ctx) => {
ctx.getAttribute('nwind_ordernumber')?.setValue('ORD-API-001');
ctx.getAttribute('nwind_notes')?.setValue('Updated via Xrm API');
});
Nota:
Se omiten los eventos de entrada del explorador al establecer valores con execute(). En el caso de los campos con onChange reglas de negocio, este enfoque equivale a lo que haría un complemento o script. Para los campos que dependen del foco de entrada del explorador o los eventos de desenfoque, use mda.form.setAttribute(), que desencadena la ruta de acceso de la interfaz de usuario.
Validación de reglas de lógica de negocios
Pruebe que las reglas de negocio a nivel de campo o formulario se activen correctamente.
// 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');
Comprobar la validez del formulario y el estado desfasado
Use los isDirty()métodos , isValid()y save() para comprobar que los cambios de formulario se realizan correctamente y que la validación pasa antes y después de guardar.
// 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);
Ejecutar llamadas a Xrm WebApi
Xrm.WebApi completo está disponible dentro de execute(). Úselo para consultar o mutar los registros de Dataverse directamente.
// 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);
Importante
Xrm.WebApi las llamadas se ejecutan en el contexto del explorador y están sujetas a los límites de la API de Dataverse y al rol de seguridad del usuario de prueba. Se descuentan de tu cuota de llamadas de API.
Probar efectos secundarios del complemento
Después de guardar un registro, use execute() para comprobar que un complemento actualizó correctamente un campo relacionado.
// 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);
Combinación de la navegación de la interfaz de usuario con aserciones de API
Un patrón común consiste en impulsar la navegación a través de la interfaz de usuario y, a continuación, validar el estado a través de la API. En el ejemplo siguiente se abre un pedido desde la cuadrícula, se hace clic en el botón de la barra de comandos Enviar pedido y, a continuación, se usa la API Xrm para verificar que el estado del pedido se actualizó a Pendiente.
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
});
Referencia de la API de contexto de formulario
El
| Método | Descripción |
|---|---|
getAttribute(name) |
Obtención de un atributo de formulario por nombre de esquema |
getAttribute(name).getValue() |
Lee el valor del campo actual. |
getAttribute(name).setValue(v) |
Establecer el valor del campo |
getAttribute(name).getRequiredLevel() |
Leer 'none', 'recommended' o 'required' |
getAttribute(name).setRequiredLevel(level) |
Establecer el nivel necesario |
getControl(name).setVisible(bool) |
Mostrar u ocultar un campo |
getControl(name).setDisabled(bool) |
Habilitar o deshabilitar un campo |
ui.tabs.get(name).setVisible(bool) |
Mostrar u ocultar una pestaña |
data.entity.getId() |
Obtención del GUID del registro actual |
data.entity.getEntityName() |
Obtención del nombre de la entidad lógica |
data.save() |
Guardar el formulario mediante programación |
Para obtener la referencia completa de la API de cliente Xrm, consulte Microsoft Dataverse referencia de API de cliente.