StockSharp DesktopDriver
Servidor MCP local para automatización de UI en Avalonia, WPF y MAUI, inspección de controles, capturas de pantalla y pruebas.
Documentación
StockSharp DesktopDriver
Conduce aplicaciones de escritorio construidas con Avalonia, WPF o MAUI desde pruebas, desde una línea de comandos, o desde un agente de IA a través de MCP.
DesktopDriver lee la interfaz, no la pantalla. Una tabla responde con sus columnas y filas, un árbol con sus elementos, un espacio de trabajo con sus paneles, en palabras que no cambian con un tema, una fuente o un idioma. La entrada pasa por el propio pipeline del toolkit, y solo hacia una ejecución que no puede alcanzar nada real. Las imágenes están ahí para que una persona las mire; las pruebas verifican lo que dicen los controles.
Cómo funciona
- Una aplicación que puede ser conducida hace referencia al bootstrap de su toolkit. Iniciada de la manera ordinaria, no abre nada. Iniciada con
--ui-automation, abre un endpoint local de named-pipe restringido al usuario actual del sistema operativo, y escribe dónde está el endpoint en el archivo nombrado por--ui-automation-endpoint=<path>. - Un ejecutor (una prueba, la línea de comandos, el servidor MCP) inicia la aplicación de esa manera (o se adjunta a una que alguien más inició), verifica el producto, la instancia y el protocolo en el handshake de la sesión y pregunta: qué ventanas están abiertas, qué hay en esta, qué muestra esta tabla. Luego puede hacer clic, escribir, presionar teclas y desplazarse, y esperar a que la respuesta cambie.
- Los adaptadores convierten los controles en lo que el protocolo conoce: cuadrículas, árboles, listas, selectores, espacios de trabajo, gráficos, documentos, diagramas. Una aplicación registra adaptadores para sus propios controles a través de la misma interfaz que usan los estándar.
Paquetes NuGet
Instala la CLI o el servidor MCP con el .NET 10 SDK:
dotnet tool install StockSharp.DesktopDriver.Cli --tool-path tools
dotnet tool install StockSharp.DesktopDriver.Mcp --tool-path tools
Los comandos son tools/desktop-driver y tools/desktop-driver-mcp. Para añadir automatización a una aplicación, haz referencia al paquete bootstrap de su toolkit. Para conducirla desde código, usa los paquetes de cliente, ejecutor y pruebas.
Para la publicación en el Registro MCP y las extensiones de Claude Desktop, consulta Distribución MCP.
| Paquete | Qué es |
|---|---|
| StockSharp.DesktopDriver.Contracts | El protocolo: solicitudes, respuestas, estados, direcciones |
| StockSharp.DesktopDriver.Runtime | Lectura, identidad, revisiones y espera, independiente de cualquier toolkit |
| StockSharp.DesktopDriver.Host | El endpoint dentro de la aplicación, y UiAutomationLaunch para leer cómo se inició |
| StockSharp.DesktopDriver.Client | El cliente tipado a través del cual habla todo ejecutor |
| StockSharp.DesktopDriver.Runner | Inicia, encuentra y alcanza aplicaciones; el catálogo de lo que puede iniciarse |
| StockSharp.DesktopDriver.Testing | Lo que necesita una suite MSTest además del ejecutor |
| StockSharp.DesktopDriver.Cli | La línea de comandos |
| StockSharp.DesktopDriver.Mcp | El servidor MCP, consulta su README |
| StockSharp.DesktopDriver.Avalonia | Avalonia: lectura, entrada e imágenes de los controles estándar |
| StockSharp.DesktopDriver.Avalonia.ProDataGrid | Avalonia: el DataGrid de ProDataGrid, leído como tabla |
| StockSharp.DesktopDriver.Avalonia.Dock | Avalonia: un espacio de trabajo Dock.Avalonia, leído como paneles y grupos |
| StockSharp.DesktopDriver.Avalonia.Headless | Avalonia: entrada para pruebas headless |
| StockSharp.DesktopDriver.Bootstrap.Avalonia | Avalonia: una llamada que hace que una aplicación sea conducible |
| StockSharp.DesktopDriver.Wpf | WPF: lectura, entrada e imágenes de los controles estándar |
| StockSharp.DesktopDriver.Bootstrap.Wpf | WPF: una llamada que hace que una aplicación sea conducible |
| StockSharp.DesktopDriver.Maui | MAUI: lectura, entrada e imágenes de los controles estándar |
| StockSharp.DesktopDriver.Bootstrap.Maui | MAUI en Windows: una llamada que hace que una aplicación sea conducible |
Haz que una aplicación sea conducible
Avalonia, una vez que existe la ventana principal (el ejemplo hace lo mismo solo con el módulo de cuadrícula):
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();
if (UiAutomationLaunch.TryRead(desktop.Args) is { } launch)
{
_automation = AvaloniaAutomationBootstrap.Start(
UiAutomationStartup.For("my.app", version, fixtureId: null, hasLiveOutsideWorld: false, isTestProfile: false),
launch.EndpointFile,
[binder => new DataGridAutomationModule(binder), binder => new DockAutomationModule(binder)]);
}
}
base.OnFrameworkInitializationCompleted();
}
Desecha el runtime devuelto cuando la aplicación salga. WpfAutomationBootstrap y MauiAutomationBootstrap toman los mismos argumentos.
Las aplicaciones de ejemplo muestran el inicio y el cierre para los tres toolkits. Los ejemplos de Windows con WPF y MAUI también tienen pruebas que inician sus ejecutables, se conectan a través del pipe local, leen sus controles, envían entrada y recuperan capturas de pantalla.
UiAutomationStartup.For decide si la entrada está permitida. Una aplicación que no habla con nada fuera de su propio proceso siempre es segura para hacer clic. Una que se conecta a algo real (un bróker, una tienda, un servicio) es segura solo cuando se inició con un perfil de prueba que lo reemplaza; de lo contrario, el endpoint aún lee, pero cada entrada es rechazada.
Muchas aplicaciones envían dos builds: uno ordinario sin driver, y uno hecho para ser conducido. El driver solo es referenciado por el segundo, por lo que el primero no tiene nada escuchando por construcción.
Conducirla
Desde una prueba:
await using var app = await DrivenApplication.StartAsync(executable, extraArguments: null, TimeSpan.FromSeconds(60), cancellationToken);
await using var client = await app.ConnectAsync("my.app", cancellationToken);
var windows = await client.GetSurfacesAsync(cancellationToken);
Desde una línea de comandos, contra una aplicación que alguien inició con --ui-automation:
tools/desktop-driver find --endpoint endpoint.json --kind grid
tools/desktop-driver grid-rows --endpoint endpoint.json --node window:MainWindow/Instruments --limit 5
desktop-driver sin argumentos imprime cada operación.
Desde un agente: registra el servidor MCP, consulta DesktopDriver.Mcp.
Su nombre MCP es StockSharp.DesktopDriver, y su título de visualización es StockSharp DesktopDriver.
Documentos
- Cómo está construido el driver
- El protocolo
- Qué responde para qué control, y cómo añadir un adaptador
- La línea de comandos
- El servidor MCP
- Builds, suites de pruebas y lanzamientos
- Aplicaciones de ejemplo y pruebas de integración de Windows
Build y prueba
dotnet build DesktopDriver.slnx
dotnet test DesktopDriver.Runtime.Tests --filter "FullyQualifiedName~Revision"
Los proyectos MAUI necesitan la carga de trabajo MAUI Windows. Las pruebas de aplicación MCP, las pruebas de captura de pantalla WPF y DesktopDriver.Windows.Tests necesitan una sesión de escritorio de Windows interactiva. Ejecuta las suites filtradas con tiempos de espera de cuelgue y sesión usando ./.github/scripts/Test.ps1 -Suite Headless o -Suite Desktop después de un build Release.
Paquetes desde el código fuente
dotnet pack DesktopDriver.slnx -c Release -o artifacts/packages
Fuentes en lugar de paquetes
Un producto verificado junto a este repositorio puede referenciar los propios proyectos:
<ProjectReference Include="..\DesktopDriver.Mcp\DesktopDriver.Bootstrap.Avalonia\DesktopDriver.Bootstrap.Avalonia.csproj" />
Un producto que construye una segunda copia conducible de sí mismo pasando una propiedad en la línea de comandos añade GlobalPropertiesToRemove="<that property>" a la referencia: el driver no tiene un build propio para ello, y de lo contrario se construiría dos veces en la misma carpeta.
Licencia
Consulta LICENSE.