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

MCP on NuGet CLI on NuGet

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

  1. 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>.
  2. 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.
  3. 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.

PacoteO que é
StockSharp.DesktopDriver.ContractsO protocolo: requisições, respostas, estados, endereços
StockSharp.DesktopDriver.RuntimeLeitura, identidade, revisões e espera, independente de qualquer toolkit
StockSharp.DesktopDriver.HostO endpoint dentro do aplicativo e UiAutomationLaunch para ler como foi iniciado
StockSharp.DesktopDriver.ClientO cliente tipado pelo qual todo runner se comunica
StockSharp.DesktopDriver.RunnerInicia, encontra e alcança aplicativos; o catálogo do que pode ser iniciado
StockSharp.DesktopDriver.TestingO que uma suíte MSTest precisa além do runner
StockSharp.DesktopDriver.CliA linha de comando
StockSharp.DesktopDriver.McpO servidor MCP, veja seu README
StockSharp.DesktopDriver.AvaloniaAvalonia: leitura, entrada e imagens dos controles padrão
StockSharp.DesktopDriver.Avalonia.ProDataGridAvalonia: o DataGrid do ProDataGrid, lido como tabela
StockSharp.DesktopDriver.Avalonia.DockAvalonia: um workspace Dock.Avalonia, lido como painéis e grupos
StockSharp.DesktopDriver.Avalonia.HeadlessAvalonia: entrada para testes headless
StockSharp.DesktopDriver.Bootstrap.AvaloniaAvalonia: uma chamada que torna um aplicativo dirigível
StockSharp.DesktopDriver.WpfWPF: leitura, entrada e imagens dos controles padrão
StockSharp.DesktopDriver.Bootstrap.WpfWPF: uma chamada que torna um aplicativo dirigível
StockSharp.DesktopDriver.MauiMAUI: leitura, entrada e imagens dos controles padrão
StockSharp.DesktopDriver.Bootstrap.MauiMAUI 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

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.