资讯动态

Python操作同花顺客户端自动化测试与外部插件实战

发布时间:2026/9/3 4:37:13 来源:尧图企业网站定制
简介面向量化交易与程序化下单场景这份资源提供了一套围绕同花顺客户端展开的Python自动化测试代码与配套插件适合对证券客户端操作自动化、交易接口封装、量化策略落地执行感兴趣的开发者研究参考具备一定Python基础即可上手。压缩包共3个文件包含两个Python脚本和一个7z压缩包脚本分别覆盖客户端下单流程与自动化测试用例7z包内为插件或依赖组件整体体积12.3MB。已有2591人学习。通过学习这份代码可快速了解调用同花顺客户端下单、界面元素识别、状态等待与异常处理等常见方式也能借鉴其测试脚本结构配合插件完成从启动客户端到交易指令提交的闭环流程为二次开发或自建量化辅助工具提供思路。 干了这么多年测试开发和量化工具链的活我拿到“Python操作同花顺客户端自动化测试代码与插件”这个需求时第一反应是熟悉的头痛——Windows桌面客户端、层层叠叠的窗口句柄、不同版本之间飘忽不定的控件树这些东西足够让刚接触的人直接劝退。但真把它跑起来之后你会发现在行情数据核对、自选股批量导入、登录流程回归这些重复劳动上这套自动化方案的性价比高得离谱。这篇文章不聊理论就讲我实际踩通的一条路怎么用Python把同花顺客户端的界面操作变成可重复执行的自动化脚本以及怎么在不动客户端本身的前提下用“外部插件”的思路扩展现有功能。适合三类人看一是要做金融客户端UI回归测试的测试工程师二是想减少重复手工操作的量化研究员三是单纯想学Windows桌面自动化、手里正好拿同花顺练手的学习者。1. 整体思路与技术选型1.1 先把自动化目标拆清楚接到需求别急着写代码第一步是弄清楚自动化到底要覆盖哪些业务场景。以我这边为例需求主要分四块登录流程回归测试、行情面板数据一致性校验、自选股批量导入导出的功能验证、界面状态在不同分辨率下的展示检查。这几块对应的技术难度完全不同。登录流程涉及窗口跳转和控件输入行情数据校验重点在表格控件的数据读取批量导入导出则要处理文件对话框和进度等待。把目标拆细之后方案选型才有依据不然很容易出现“写了个能点按钮的脚本但业务根本用不上”的尴尬情况。1.2 Python操作Windows客户端的几个主流方案目前Python操作Windows桌面程序主流路子就这几种pywinauto封装了Win32 API和UI Automation两种后端对标准Windows控件Edit、Button、List、Tree支持比较成熟上手快文档也全。pyautogui纯模拟鼠标键盘配合截屏做图像识别属于“看不到控件树时的最后手段”稳定性和速度都一般但胜在啥都能点。uiautomation基于微软UI Automation框架能访问更多控件属性AutomationId、ControlType对自绘控件和复杂嵌套界面比pywinauto更稳。win32gui / win32api直接用Win32消息做句柄级操作灵活但工作量大适合处理那些控件树里根本看不见的“黑窗口”。这四个方案不是互斥关系。实际项目里我通常按“标准控件优先、自绘控件跟上、图像兜底”的顺序组合使用。1.3 我的选型双后端加图像兜底同花顺客户端是典型的多技术栈混合界面老模块用MFC新模块带自绘控件不同版本差异还大。单一方案很容易翻车。我的组合是pywinauto做主力uiautomation做补充pyautogui做最后兜底。这样选的原因很直接pywinauto打印控件树方便调试效率高碰到控件树里找不到的自绘区域比如行情列表某些动态刷新区域切到uiautomation按AutomationId定位成功率会高不少两个都拿不下的非标准组件再用pyautogui截屏模板匹配点坐标。这套三层兜底策略让我在一个项目里省掉了大半的“控件找不到”问题。2. 环境准备与基础识别2.1 环境搭建与依赖安装建议用虚拟环境隔离依赖Python 3.12下这些库都正常工作。直接执行pip install pywinauto uiautomation pyautogui pillow pytesseract其中pywinauto和uiautomation是做界面定位的两大支柱pyautogui用于模拟键鼠和截屏Pillow做图像处理pytesseract是验证码识别回填要用到的OCR引擎后面会细说。注意pytesseract只是Python封装底层需要安装Tesseract-OCR引擎Windows下记得把tesseract.exe所在目录加到系统PATH里否则运行时会报“tesseract is not installed”这类错误。2.2 连接正在运行的客户端窗口操作客户端前先要建立连接。这里有两种情况脚本自己启动客户端或者连接已经打开的客户端。from pywinauto import Application # 方式一脚本启动并连接 app Application(backenduia).start(rD:\同花顺\xiadan.exe) # 方式二连接已运行的进程用进程ID或进程名 app Application(backenduia).connect(process12345) # app Application(backenduia).connect(pathrD:\同花顺\xiadan.exe)连接成功后用top_window()拿到主窗口对象。这里有个实操经验优先用connect而不是start因为很多测试场景下客户端已经人工登录好了脚本只需要“接管”当前窗口减少启动带来的不确定性。2.3 控件树定位先打印再定位还没摸清界面结构之前最忌讳凭感觉写控件路径。我每接到一个新版本客户端第一件事就是把控件树完整打印出来main_win app.top_window() main_win.print_control_identifiers()输出内容很多建议重定向到文件再看with open(controls.txt, w, encodingutf-8) as f: f.write(main_win.window_text() \n) main_win.print_control_identifiers(filef)控件树里能看到所有子控件的类型、文本、AutomationId和坐标范围。定位时优先用auto_id和control_type其次才考虑title。理由是坐标会随分辨率、窗口大小变化而AutomationId在大多数情况下是稳定的。3. 核心实操从登录到行情数据校验3.1 登录流程自动化登录是同花顺自动化最典型的场景账号输入框、密码输入框、登录按钮、可能的验证码弹窗、登录后的状态变化。代码如下# 切换到uia后端拿更完整的控件属性 app Application(backenduia).connect(pathrD:\同花顺\xiadan.exe) login_win app.window(auto_idLoginDlg) account_edit login_win.child_window(auto_idAccountEdit) password_edit login_win.child_window(auto_idPwdEdit) login_btn login_win.child_window(auto_idLoginBtn) account_edit.set_text(你的测试账号) password_edit.set_text(你的测试密码) login_btn.click()两个细节值得注意一是密码不要硬编码在代码里用环境变量或单独的配置文件管理否则脚本传出公司就变成安全事故二是在click()之前先等一下控件变为可用状态可以用wait(ready)或login_btn.wait(enabled, timeout10)。3.2 验证码回填的合规思路与实现登录界面上如果有验证码自动化脚本要能把验证码自动识别并回填进去。这里必须先把边界说清楚这套代码只能用于你本人拥有合法使用权的测试账号在合规的测试环境里做UI回归测试。验证码识别的目标是把“人眼看图填码”变成“程序自动填码”让无人值守的用例能往下跑而不是绕过任何安全机制。具体实现分三步截取验证码控件区域、图片预处理、OCR识别并回填。import pyautogui from PIL import Image, ImageEnhance import pytesseract import uiautomation as auto # 找到验证码图片控件 code_ctl auto.Control(searchDepth2, ClassNameStatic, Name) rect code_ctl.BoundingRectangle # 截取控件区域 img pyautogui.screenshot(region(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top)) # 灰度增强尽可能去掉干扰线 gray img.convert(L) enhancer ImageEnhance.Contrast(gray) gray enhancer.enhance(2.0) gray.save(captcha.png) # OCR识别 code_text pytesseract.image_to_string(gray, config--psm 7 -c tessedit_char_whitelist0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ).strip() print(识别结果:, code_text) # 回填到验证码输入框 code_edit.set_text(code_text)这里要特别强调OCR识别不可能100%成功干扰线、字体变形都会导致识别失败。所以脚本里必须做失败兜底——识别结果为空或长度不对时自动暂停并弹出人工确认窗口而不是拿错误验证码反复重试。这既是技术问题也是测试设计的基本素养。3.3 行情列表数据读取与一致性校验登录之后最常用的自动化场景就是读取行情列表数据然后与数据库或接口返回的结果做比对。这步的逻辑是把客户端界面当成“被测对象”验证它展示的数据与数据源是否一致。table_ctl main_win.child_window(auto_idMarketTable) if table_ctl.exists(): rows table_ctl.children() for row in rows: cell_texts [cell.window_text() for cell in row.children()] print(cell_texts)实际操作中行情列表是动态刷新的读数据时可能正好遇到数据更新导致比对“看似不一致”。我的做法是读取两次、间隔1秒只有两次结果一致才作为最终值参与断言否则重新读取。这个细节能省掉大量误报。3.4 自选股批量导入导出的回归验证自选股批量导入导出是典型的重复性手工操作非常适合自动化。流程就是点击导入按钮在文件选择框里输入路径等待导入完成再校验列表数量与内容。文件对话框是自动化里的常见坑因为它是系统级窗口不归客户端管。用pywinauto连接系统对话框再操作from pywinauto import Application import time main_win.child_window(auto_idImportBtn).click() time.sleep(2) dlg Application(backenduia).connect(title打开, timeout5).top_window() dlg.child_window(auto_id1148).set_text(rD:\test\stocks.txt) # 文件名输入框 dlg.child_window(auto_id1).click() # 打开按钮auto_id1148是Windows文件对话框里文件名输入框的固定IDauto_id1是打开按钮这两个值在大多数Windows版本上通用。如果在某台机器上失效用print_control_identifiers()重新抓一次就行。4. 插件机制解析与外部扩展思路4.1 认识同花顺的公式系统与扩展能力同花顺客户端本身提供了一套公式系统用户可以在软件里编辑指标公式、条件选股公式这些公式跑在客户端内部可以直接引用行情数据。做自动化测试时公式系统能提供一个很有价值的“预期值来源”——比如测试行情数据展示是否正确可以先在软件里跑一个简单的收盘价公式得到结果后再与外部接口数据比对多一条验证路径。更关键的是同花顺支持外部扩展接口比如通过DLL方式调用行情数据。这块接口文档比较老不同版本兼容性有差异用之前最好先确认目标测试机上的客户端版本。我的建议是尽量不要碰客户端内部插件的高风险接口优先用“外部联动工具”的思路去解决问题降低维护成本和法律风险。4.2 用Python做“外部测试插件”所谓外部测试插件就是不改动客户端本身而是用Python脚本把客户端、本地文件和第三方数据源串起来形成一个半自动化的测试工具链。它的优势在于不侵入软件、不破坏用户协议边界、升级客户端也不影响。我实际做过的一个方案长这样用客户端自带的导出功能把自选股列表导出为文本文件写Python脚本解析导出文件生成一批测试数据比如新增自选股、删掉某只股票通过界面自动化把测试数据重新导入客户端再导出一份结果文件用脚本比对新旧数据输出测试报告。这一套组合拳下来自选股导入导出功能的回归测试就完全自动化了而且每一步都能生成日志出问题能直接定位到具体数据。另外我还会开发一个本地Web小工具用Flask在测试机上启动一个简单页面脚本状态、测试进度、识别失败的验证码截图都实时展示在页面上。跑无人值守用例的时候不用一直盯着屏幕只要看网页上的进度条就行。这个“外部看板”配合自动化脚本体验提升不少。5. 常见问题与排查技巧实录5.1 控件找不到或控件树里啥都没有这是桌面自动化最高频的问题。原因通常是三个窗口还没完全加载、控件是自绘的、控件的自动化属性被屏蔽或动态生成。排查流程我固定走三步先确认窗口存在且处于激活状态再重新打印控件树看节点有没有变化最后用uiautomation的searchDepth增大搜索深度。自绘控件实在不行就切到pyautogui按截图区域点击但要记住图像方案是兜底能定位到控件就别用它。5.2 输入内容不对或中文乱码set_text()往Windows原生Edit控件里填内容一般没毛病但有些控件不是标准Edit会出现“看着填了实际没填进去”的情况。这时改用键盘输入edit.click() from pywinauto.keyboard import send_keys send_keys(600519, with_spacesTrue)中文输入还有一个坑输入法状态会导致字符错乱。解决办法是先把中文内容放进剪贴板再模拟CtrlV粘贴import subprocess subprocess.run([clip.exe], input中国平安, encodingutf-8, shellTrue) edit.click() send_keys(^v)实测这一招对同花顺的搜索框特别好用比一个字符一个字符敲稳定得多。5.3 客户端启动慢导致脚本崩溃客户端冷启动可能要十几秒如果脚本一启动就去connect大概率报找不到窗口。我的做法是写一个等待连接的重试循环import time from pywinauto import Application deadline time.time() 30 while time.time() deadline: try: app Application(backenduia).connect(pathrD:\同花顺\xiadan.exe, timeout2) break except Exception: time.sleep(1) else: raise TimeoutError(客户端启动超时)超时时间按测试机性能调整30秒是我试过的稳定值如果测试机特别老可以放宽到60秒。5.4 管理员权限和并发冲突同花顺某些模块需要管理员权限运行所以跑脚本的Python进程最好也用管理员身份启动否则可能出现“脚本能连上窗口但点击无效”的情况。右键“以管理员身份运行”命令行再执行脚本能避掉大半权限问题。并发则是另一个极端同花顺客户端默认单实例不支持一台机器同时开多个客户端进程做并发测试。想压测的话只能用多台机器或虚拟机做分布式我这边就是准备了3台Windows虚拟机主控脚本通过SSH下发任务各自跑各自的用例再回传结果。虽然土了点但胜在稳定。最后留个底在整个折腾过程中我最深的体会是三件事。第一是定位策略永远优先用控件属性别用坐标坐标只能当临时方案。第二是验证码识别这类功能一定要把“识别失败”当正常流程来设计人工兜底不是丢人的事反而能让无人值守真正跑得久。第三外部联动工具的思路比改客户端内部插件要稳得多维护成本和风险都低一大截。如果你手上正好有同花顺客户端的自动化需求我建议从登录自选股导入导出这两个场景起步跑通之后再往行情数据校验扩展。这套路子跑顺了Windows桌面客户端自动化的核心技能也就掌握得差不多了。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价