StockSharp DesktopDriver
Servidor MCP local para automação de UI em Avalonia, WPF e MAUI, inspeção de controles, capturas de tela e testes.
Documentação
StockSharp DesktopDriver
Dirija aplicativos desktop construídos com Avalonia, WPF ou MAUI a partir de testes, da linha de comando ou de um agente de IA via MCP.
O DesktopDriver lê a interface, não a tela. Uma tabela responde com suas colunas e linhas, uma árvore com seus itens, um workspace com seus painéis — em palavras que não mudam com tema, fonte ou idioma. A entrada passa pelo pipeline próprio do toolkit e somente para uma execução que não pode alcançar nada real. Imagens existem para uma pessoa olhar; testes verificam o que os controles dizem.
Como funciona
- Um aplicativo que pode ser dirigido referencia o bootstrap do seu toolkit. Iniciado da maneira comum, não abre nada. Iniciado com
--ui-automation, abre um endpoint local de named pipe restrito ao usuário atual do SO e grava onde o endpoint está no arquivo nomeado por--ui-automation-endpoint=<path>. - Um runner — um teste, a linha de comando, o servidor MCP — inicia o aplicativo dessa forma (ou anexa a um que outra pessoa iniciou), verifica o produto, a instância e o protocolo no handshake da sessão e pergunta: quais janelas estão abertas, o que há nesta, o que esta tabela mostra. Ele pode então clicar, digitar, pressionar teclas e rolar, e aguardar a resposta mudar.
- Adaptadores transformam controles no que o protocolo conhece: grades, árvores, listas, seletores, workspaces, gráficos, documentos, diagramas. Um aplicativo registra adaptadores para seus próprios controles pela mesma interface que os padrões usam.
Pacotes NuGet
Instale a CLI ou o servidor MCP com o .NET 10 SDK:
dotnet tool install StockSharp.DesktopDriver.Cli --tool-path tools
dotnet tool install StockSharp.DesktopDriver.Mcp --tool-path tools
Os comandos são tools/desktop-driver e tools/desktop-driver-mcp. Para adicionar automação a um aplicativo, referencie o pacote de bootstrap do seu toolkit. Para dirigi-lo a partir de código, use os pacotes de cliente, runner e teste.
Para publicação no MCP Registry e extensões do Claude Desktop, veja distribuição MCP.
| Pacote | O que é |
|---|---|
| StockSharp.DesktopDriver.Contracts | O protocolo: requisições, respostas, estados, endereços |
| StockSharp.DesktopDriver.Runtime | Leitura, identidade, revisões e espera, independente de qualquer toolkit |
| StockSharp.DesktopDriver.Host | O endpoint dentro do aplicativo e UiAutomationLaunch para ler como foi iniciado |
| StockSharp.DesktopDriver.Client | O cliente tipado pelo qual todo runner se comunica |
| StockSharp.DesktopDriver.Runner | Inicia, encontra e alcança aplicativos; o catálogo do que pode ser iniciado |
| StockSharp.DesktopDriver.Testing | O que uma suíte MSTest precisa além do runner |
| StockSharp.DesktopDriver.Cli | A linha de comando |
| StockSharp.DesktopDriver.Mcp | O servidor MCP, veja seu README |
| StockSharp.DesktopDriver.Avalonia | Avalonia: leitura, entrada e imagens dos controles padrão |
| StockSharp.DesktopDriver.Avalonia.ProDataGrid | Avalonia: o DataGrid do ProDataGrid, lido como tabela |
| StockSharp.DesktopDriver.Avalonia.Dock | Avalonia: um workspace Dock.Avalonia, lido como painéis e grupos |
| StockSharp.DesktopDriver.Avalonia.Headless | Avalonia: entrada para testes headless |
| StockSharp.DesktopDriver.Bootstrap.Avalonia | Avalonia: uma chamada que torna um aplicativo dirigível |
| StockSharp.DesktopDriver.Wpf | WPF: leitura, entrada e imagens dos controles padrão |
| StockSharp.DesktopDriver.Bootstrap.Wpf | WPF: uma chamada que torna um aplicativo dirigível |
| StockSharp.DesktopDriver.Maui | MAUI: leitura, entrada e imagens dos controles padrão |
| StockSharp.DesktopDriver.Bootstrap.Maui | MAUI no Windows: uma chamada que torna um aplicativo dirigível |
Torne um aplicativo dirigível
Avalonia, uma vez que a janela principal exista (o exemplo faz o mesmo apenas com o módulo de grade):
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();
}
Descarte o runtime retornado quando o aplicativo sair. WpfAutomationBootstrap e MauiAutomationBootstrap aceitam os mesmos argumentos.
Os aplicativos de exemplo mostram inicialização e desligamento para os três toolkits. Os exemplos WPF e MAUI para Windows também têm testes que iniciam seus executáveis, conectam-se pelo pipe local, leem seus controles, enviam entrada e obtêm capturas de tela.
UiAutomationStartup.For decide se a entrada é permitida. Um aplicativo que não fala com nada fora do seu próprio processo é sempre seguro para clicar. Um que se conecta a algo real — uma corretora, uma loja, um serviço — é seguro apenas quando foi iniciado em um perfil de teste que o substitui; caso contrário, o endpoint ainda lê, mas toda entrada é recusada.
Muitos aplicativos enviam duas versões: uma comum sem driver e uma feita para ser dirigida. O driver é referenciado apenas pela segunda, então a primeira não tem nada escutando por construção.
Dirija-o
A partir de um teste:
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);
A partir da linha de comando, contra um aplicativo que alguém iniciou com --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 sem argumentos imprime todas as operações.
A partir de um agente: registre o servidor MCP, veja DesktopDriver.Mcp.
Seu nome MCP é StockSharp.DesktopDriver e seu título de exibição é StockSharp DesktopDriver.
Documentos
- Como o driver é construído
- O protocolo
- O que responde por qual controle e como adicionar um adaptador
- A linha de comando
- O servidor MCP
- Builds, suítes de teste e lançamentos
- Aplicativos de exemplo e testes de integração no Windows
Build e teste
dotnet build DesktopDriver.slnx
dotnet test DesktopDriver.Runtime.Tests --filter "FullyQualifiedName~Revision"
Os projetos MAUI precisam da carga de trabalho MAUI para Windows. Testes de aplicativo MCP, testes de captura de tela WPF e DesktopDriver.Windows.Tests precisam de uma sessão interativa de desktop Windows. Execute as suítes filtradas com timeouts de hang e sessão usando ./.github/scripts/Test.ps1 -Suite Headless ou -Suite Desktop após um build Release.
Pacotes a partir do código-fonte
dotnet pack DesktopDriver.slnx -c Release -o artifacts/packages
Fontes em vez de pacotes
Um produto com checkout ao lado deste repositório pode referenciar os próprios projetos:
<ProjectReference Include="..\DesktopDriver.Mcp\DesktopDriver.Bootstrap.Avalonia\DesktopDriver.Bootstrap.Avalonia.csproj" />
Um produto que constrói uma segunda cópia dirigível de si mesmo passando uma propriedade na linha de comando adiciona GlobalPropertiesToRemove="<that property>" à referência: o driver não tem build próprio para isso e seria construído duas vezes na mesma pasta.
Licença
Veja LICENSE.