关于 StockSharp DesktopDriver
StockSharp DesktopDriver 可供测试、命令行工具和 AI Agent 检查并操作 Avalonia、WPF 与 MAUI 桌面应用。它读取控件的结构化内容,而非依赖屏幕图像,并可限制输入仅用于安全的测试运行。
主要功能
- 01读取窗口与控件内容
- 02操作控件并等待状态变化
- 03支持 Avalonia、WPF 和 MAUI
- 04通过适配器解析专用控件
- 05提供命令行与测试组件
适用场景
- 01检查桌面应用中的表格和树
- 02自动化桌面应用测试
- 03让 AI Agent 操作桌面应用
- 04在受控测试运行中发送输入
MCP 相关
其 MCP 服务可让 AI Agent 通过 MCP 驱动桌面应用,并与命令行和测试运行器一样连接本地应用端点。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
StockSharp DesktopDriver
通过测试、命令行或经由 MCP 连接的 AI Agent,驱动基于 Avalonia、WPF 或 MAUI 构建的桌面应用。
DesktopDriver 读取的是界面,而不是屏幕。表格会返回其列和行,树会返回其节点,工作区会返回其面板——这些描述不会因主题、字体或语言而改变。输入会经过工具包自身的处理流程,并且仅作用于无法接触任何真实内容的运行实例。图片供人查看;测试则检查控件所表达的内容。
工作原理
- 可被驱动的应用会引用其工具包的引导程序。以常规方式启动时,它不会打开任何内容。使用
--ui-automation启动时,它会打开一个仅限当前 OS 用户访问的本地命名管道端点,并将端点位置写入--ui-automation-endpoint=<path>指定的文件。 - 运行器——测试、命令行或 MCP 服务——以这种方式启动应用(或连接到他人已启动的应用),在会话握手中检查产品、实例和协议,然后询问:打开了哪些窗口,这个窗口里有什么,这个表格显示了什么。之后,它可以点击、输入文本、按键和滚动,并等待结果发生变化。
- 适配器会将控件转换为协议支持的内容:网格、树、列表、选择器、工作区、图表、文档、示意图。应用可以通过标准适配器所用的同一接口,为自己的控件注册适配器。
NuGet 包
使用 .NET 10 SDK 安装 CLI 或 MCP 服务:
dotnet tool install StockSharp.DesktopDriver.Cli --tool-path tools
dotnet tool install StockSharp.DesktopDriver.Mcp --tool-path tools
这些命令分别是 tools/desktop-driver 和 tools/desktop-driver-mcp。若要为应用添加自动化功能,请引用其工具包对应的引导包。若要通过代码驱动应用,请使用客户端、运行器和测试包。
有关 MCP Registry 发布和 Claude Desktop 扩展,请参阅 MCP 分发。
| 包 | 说明 |
|---|---|
| StockSharp.DesktopDriver.Contracts | 协议:请求、响应、状态、地址 |
| StockSharp.DesktopDriver.Runtime | 读取、身份、修订版本和等待,不依赖任何工具包 |
| StockSharp.DesktopDriver.Host | 应用内部的端点,以及用于读取应用启动方式的 UiAutomationLaunch |
| StockSharp.DesktopDriver.Client | 每个运行器都会通过它进行交互的类型化客户端 |
| StockSharp.DesktopDriver.Runner | 启动、查找并连接应用;包含可启动应用的目录 |
| StockSharp.DesktopDriver.Testing | MSTest 测试套件在运行器之外所需的内容 |
| StockSharp.DesktopDriver.Cli | 命令行 |
| StockSharp.DesktopDriver.Mcp | MCP 服务,参见其 README |
| StockSharp.DesktopDriver.Avalonia | Avalonia:读取、输入和标准控件的图片 |
| StockSharp.DesktopDriver.Avalonia.ProDataGrid | Avalonia:将 ProDataGrid 的 DataGrid 读取为表格 |
| StockSharp.DesktopDriver.Avalonia.Dock | Avalonia:将 Dock.Avalonia 工作区读取为面板和组 |
| StockSharp.DesktopDriver.Avalonia.Headless | Avalonia:用于无头测试的输入 |
| StockSharp.DesktopDriver.Bootstrap.Avalonia | Avalonia:只需调用一次即可让应用可被驱动 |
| StockSharp.DesktopDriver.Wpf | WPF:读取、输入和标准控件的图片 |
| StockSharp.DesktopDriver.Bootstrap.Wpf | WPF:只需调用一次即可让应用可被驱动 |
| StockSharp.DesktopDriver.Maui | MAUI:读取、输入和标准控件的图片 |
| StockSharp.DesktopDriver.Bootstrap.Maui | Windows 上的 MAUI:只需调用一次即可让应用可被驱动 |
让应用可供驱动
Avalonia:主窗口创建后(示例仅使用网格模块,也采用同样的做法):
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();
}
应用退出时,释放返回的运行时。WpfAutomationBootstrap 和
MauiAutomationBootstrap 接受相同的参数。
示例应用展示了这三种工具包的启动和关闭方式。WPF 和 MAUI Windows 示例还包含一些测试:启动可执行文件,通过本地管道连接, 读取控件、发送输入并获取屏幕截图。
UiAutomationStartup.For 会判断是否允许输入。只与自身进程内的对象通信的应用,始终可以安全地通过点击来操作。连接到真实对象(例如代理、商店或服务)的应用,只有在通过会替换这些对象的测试配置文件启动时才安全;否则,端点仍可读取,但所有输入都会被拒绝。
许多应用会提供两个构建版本:普通版本不包含驱动程序,另一个版本则可供驱动。驱动程序只会被第二个版本引用,因此第一个版本从构建时起就不会有任何监听器。
驱动应用
在测试中:
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);
在命令行中,针对通过 --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 会打印所有操作。
在 Agent 中:注册 MCP 服务,参见 DesktopDriver.Mcp。
其 MCP 名称为 StockSharp.DesktopDriver,显示标题为 StockSharp DesktopDriver。
文档
- 驱动程序的构建方式
- 协议
- 各类控件对应的响应,以及如何添加适配器
- 命令行
- MCP 服务
- 构建、测试套件和发布
- 示例应用和 Windows 集成测试
构建和测试
dotnet build DesktopDriver.slnx
dotnet test DesktopDriver.Runtime.Tests --filter "FullyQualifiedName~Revision"
MAUI 项目需要 MAUI Windows 工作负载。MCP 应用测试、WPF 屏幕截图测试和
DesktopDriver.Windows.Tests 需要可交互的 Windows 桌面会话。完成 Release 构建后,可通过 ./.github/scripts/Test.ps1 -Suite Headless 或 -Suite Desktop 运行带有挂起和会话超时的筛选套件。
从源代码使用包
dotnet pack DesktopDriver.slnx -c Release -o artifacts/packages
不使用包,直接引用源代码
在本仓库旁边检出的产品可以直接引用项目:
<ProjectReference Include="..\DesktopDriver.Mcp\DesktopDriver.Bootstrap.Avalonia\DesktopDriver.Bootstrap.Avalonia.csproj" />
如果产品通过在命令行传递属性来构建自身的第二个可驱动副本,则在引用中添加
GlobalPropertiesToRemove="<that property>":驱动程序没有为其单独构建的版本,否则会在同一文件夹中构建两次。
许可证
参见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。