尧图精选

pywinauto实战:同花顺客户端自动化与验证码弹窗处理详解

🕒 发布时间:2026/9/19 6:34:36 📁 来源:尧图网络
做桌面端自动化的朋友应该都有同感Windows 原生应用的自动化跟网页自动化完全不是一回事。我最早接触 pywinauto 这个库是因为想把同花顺客户端里每天重复的几组固定操作串起来跑。原本以为无非就是“定位控件、发送点击、输入文本”结果真正上手才发现验证码识别和界面弹窗这两关就够喝一壶。前前后后折腾了将近三周踩了无数坑最终才把一个稳定的自动化流程跑起来。这篇文章就把我在同花顺场景下使用 pywinauto 的完整实战过程写出来重点拆解验证码识别和弹窗处理这两块最容易翻车的地方同时也给准备入坑的朋友一个真实的技术路线参考。如果你正打算做类似的 Windows 原生客户端自动化这文应该能帮你少走很多弯路。1. 项目整体设计与技术选型1.1 需求拆解自动化任务到底要经过哪些链路先把目标拆清楚。以同花顺 PC 客户端为对象一个完整的自动化操作链路通常包含这七步启动客户进程、连接并识别主窗体、输入账户密码、识别并填写验证码、处理登录后的各类弹窗、进入指定业务模块执行具体操作、最后处理业务过程中的确认提示。每一步之间都有依赖关系任何一步卡住后面的流程就全废了。我一开始犯的错就是想把整个流程一口气写成线性代码结果验证码识别失败一次后面的脚本就全部崩掉。真正稳定的做法是把整个自动化流程抽象成一个状态机。每一步都定义明确的输入输出执行完成后校验结果只有校验通过才进入下一步。比如登录阶段先输入账号密码再等待验证码图片更新完成后才填验证码验证码填完后点击登录按钮之后必须等待主窗体出现关键控件而不是简单睡几秒钟。这个习惯可以说救了我很多次因为同花顺的网络延迟、验证码刷新时间、弹窗出现时机全都不是固定的只有状态校验才能应付这种不确定。1.2 为什么最终选 pywinauto而不是 UIAutomation 或按键精灵市面上能做桌面自动化的方案不少我实际对比过三类。第一类是按键精灵这类录制回放工具优点是没有门槛但灵活性很差界面一改脚本就得重新录制而且它对接 Python 生态也比较吃力要做图像处理和 OCR 得额外想办法。第二类是 UIAutomation 库它是另一种封装 UI Automation 的 Python 库底层能力并不比 pywinauto 弱但社区活跃度和文档完善程度都不如 pywinauto对自绘控件的处理也没有 pywinauto 那么成熟。第三类就是 pywinauto 本身它同时支持 win32 和 uia 两种后端既能处理标准 Win32 控件也能用 UI Automation 去碰那些自绘控件和现代控件搭配 Python 做图像处理和 OCR 非常顺。我的最终选型是 pywinauto 加 OpenCV 加 OCR 库的组合。pywinauto 负责所有界面操作OpenCV 负责把验证码图片处理成适合识别的状态OCR 负责把图片内容转成文本。这个组合的好处是每一层都能独立替换比如 OCR 引擎今天用 ddddocr明天想换成 PaddleOCR只需要改接口实现不影响整体流程。对于同花顺这种以自绘控件为主的客户端pywinauto 的 uia 后端在控件识别方面表现还算可以配合坐标兜底基本能覆盖绝大多数场景。1.3 同花顺客户端的特殊性分析同花顺客户端跟普通的 Windows 应用比起来有几个非常突出的特殊性。第一个是控件大量自绘很多按钮、输入框、列表都不是标准控件你在 pywinauto 的控件树里根本找不到对应的 class_name 和 control_type这种情况下只能靠坐标点击或者图像匹配来兜底。第二个是进程和窗体不唯一它可能同时存在主窗口、弹出窗口、资讯窗口等多个顶层窗口用 connect 连接的时候如果只按标题匹配很容易抓到错误的窗口。第三个是验证码的更新机制有点奇怪验证码图片并不是每次刷新都会生成新图偶尔会出现“同一张图重复展示”的情况这给 OCR 缓存带来了麻烦——如果你做过结果缓存可能会把上一次的识别结果直接提交结果服务端返回验证码错误。第四个是弹窗种类特别多从版本更新提示、风险揭示书、公告到下单确认、撤单确认、价格偏离风险提示甚至还有行情推送的气泡窗口。如果不做专门的弹窗处理模块任何一个未预期的弹窗都可能打断主流程导致脚本卡死在等待某个控件出现的状态。后面我会专门把弹窗这块单独拿出来讲。2. 环境准备与核心原理2.1 Python 环境与依赖安装这个项目我用的是 Python 3.10理论上 3.8 以上都能跑。依赖库有以下这些pywinauto 用于界面自动化Pillow 用于图像截图和处理opencv-python 用于验证码图像的灰度化、二值化、去噪等预处理pytesseract 和 ddddocr 作为 OCR 引擎numpy 作为图像处理的底层依赖。安装命令非常简单一行 pip 就能搞定大部分pip install pywinauto pillow opencv-python numpy pytesseract ddddocr需要注意pytesseract 是一个 Python 封装它本身依赖 Tesseract OCR 引擎。Windows 下你需要单独下载安装 tesseract 程序并把它的安装路径加入系统环境变量否则调用 image_to_string 时会报“tesseract is not installed”之类的问题。ddddocr 不需要额外安装引擎但它在某些 Windows 环境下会依赖特定版本的 numpy如果安装后导入报错可以试试把 numpy 降级到 1.24 左右。我本地测试环境是 Windows 10 专业版1920x1080 分辨率系统缩放设置为 125%。这里提醒一句系统缩放比例对 pywinauto 的坐标计算有影响如果你的脚本里混用了控件识别和坐标点击一定要把缩放因素考虑进去最好在脚本启动时读取系统 DPI 设置再做坐标换算。2.2 pywinauto 核心概念速览backend、Application 与 Desktoppywinauto 最核心的概念就是 backend。它有两个后端win32 和 uia。win32 后端走的是传统的 Win32 API速度更快适合处理标准控件uia 后端走的是 UI Automation 框架能识别更多现代控件和部分自绘控件的语义比如按钮即使没有标准窗口句柄也能通过 control_type 暴露出来但速度相对慢一些。我的经验是同花顺场景优先用 uia遇到识别不到的情况再用 win32 做对比测试。Application 类是用来连接或启动目标应用的入口。连接已运行的同花顺通常这样写from pywinauto import Application app Application(backenduia).connect(title_re同花顺) win app.window(title_re同花顺) print(win.print_control_identifiers())print_control_identifiers 是最重要的调试工具它能把当前窗口的整个控件树打印出来包括每个控件的 class_name、control_type、title、auto_id 等属性。我强烈建议拿到一个不熟悉的窗口时第一件事就是先打印控件树看看结构再决定用哪种方式定位目标控件。Desktop 类则是一个虚拟的“根窗口”可以用来遍历当前桌面上所有的顶层窗口。这个在弹窗监控中特别有用因为你不知道弹窗什么时候出现需要在后台实时巡检所有窗口。2.3 连接同花顺主窗体的两种方式与踩坑连接同花顺主窗体我实验下来有两种靠谱方式。第一种是直接按进程名连接适合同花顺只开了一个进程的情况import psutil from pywinauto import Application for proc in psutil.process_iter([pid, name]): if hexin in proc.info[name].lower() or 同花顺 in proc.info[name]: app Application(backenduia).connect(pidproc.info[pid]) break第二种是按标题正则连接。同花顺主窗口的标题通常会包含“同花顺”三个字直接connect(title_re.*同花顺.*)就行但问题是有时候会同时匹配到多个窗口这时候需要进一步判断哪个是主窗口哪个是资讯弹窗或置顶小窗。我的处理方式是先连接再遍历该连接下的所有顶层窗口挑选出包含核心业务控件比如搜索框、自选股列表的那个窗口作为主窗口。这里有个很大的坑同花顺启动后可能有多个进程而且主进程不一定叫“同花顺.exe”它有可能是 hexin.exe、hexsrv.exe 之类。直接用窗口标题连接可以绕过这个麻烦但要注意标题里的“同花顺”字样在版本更新后可能变化所以更保险的做法是先用Desktop(backenduia).windows()打印出所有顶层窗口的标题、类名、进程ID再写正则规则来匹配。我第一次做的时候没打印窗口列表直接用猜的标题去连接结果连接到的只是一个包含“同花顺”字样的行情推送弹窗白白浪费了一个晚上排查。3. 验证码识别实战从截图到输出文本3.1 同花顺验证码的常见形态与识别难度评估同花顺客户端登录时会出现一个四到五位字符的验证码通常由数字和字母混合组成。从我的观察来看这个验证码并不算特别复杂干扰线不多背景有轻微噪点字符有一定程度扭曲但没有粘连到无法辨识的程度。相比那些带复杂扭曲、旋转、背景纹理的极验证码同花顺的算是中等偏下难度这给 OCR 识别提供了基础条件。不过它有一个比较麻烦的地方验证码的字体风格偶尔会变。同一台机器、同一个账号今天可能是方正的宋体样式过几天可能变成带尖角的艺术体样式。字体变化会让训练好的 OCR 模型准确率明显下降这也是我后来选择走“通用 OCR 加后处理”路线而不是“专用分类模型”的原因之一。如果你打算训练一个 CNN 分类器来识别要注意持续收集新样本不然模型会随着字体变化慢慢失效。3.2 截图定位如何准确获取验证码图片区域要让 OCR 有好的输入第一步是把验证码图片准确截下来。如果验证码是标准控件可以直接通过 pywinauto 获取控件的 bounding rectangle然后截图。但同花顺里的验证码往往是自绘的控件树里没有独立节点这时候需要用图像匹配兜底。我用的方案是先利用窗口内一个固定参照物计算缩放比例再根据人工测量得出的相对位置去截取验证码区域。比如主窗体的大小不一定固定但验证码图片相对于某个已知控件的位置比例是稳定的。代码大致是这样import ctypes from PIL import ImageGrab user32 ctypes.windll.user32 user32.SetProcessDPIAware() rect win.rectangle() left, top rect.left, rect.top width rect.right - rect.left height rect.bottom - rect.top # 根据经验比例计算验证码区域 captcha_left int(left width * 0.55) captcha_top int(top height * 0.42) captcha_right int(left width * 0.72) captcha_bottom int(top height * 0.48) captcha_img ImageGrab.grab(bbox(captcha_left, captcha_top, captcha_right, captcha_bottom)) captcha_img.save(captcha.png)SetProcessDPIAware 这行非常关键。如果你的系统开启了缩放Python 默认拿到的窗口坐标和图像实际坐标可能不一致导致截图偏移。做过桌面图像处理的应该都明白截图区域稍微歪一点后续识别率就会直线下降。3.3 图像预处理流程灰度化、去噪、二值化与形态学截图拿到之后不能直接扔给 OCR。原始验证码图片通常带背景色和噪点直接识别的效果很差。我的预处理流程如下先灰度化再高斯模糊去噪然后二值化最后做一次形态学闭运算。灰度化是把彩图转成单通道减少颜色干扰高斯模糊可以去掉细小噪点但卷积核不能太大否则字符也会被抹掉二值化是把像素分成黑白两类让背景和字符完全分离闭运算的作用是把字符中断开的笔画连接起来因为二值化之后字符笔画经常出现断裂。import cv2 import numpy as np img cv2.imread(captcha.png, cv2.IMREAD_GRAYSCALE) _, binary cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) kernel cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) closed cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) cv2.imwrite(captcha_processed.png, closed)阈值选择我用的是大津法OTSU不用手动指定阈值它能根据图像灰度分布自动计算最佳分割点。实测下来同花顺验证码在 OTSU 下效果不错字迹清晰。形态学闭运算的卷积核大小需要根据字符尺寸调整我这边 2x2 尺寸刚好再大一点会把相邻字符连在一起反而影响识别。3.4 OCR 识别与后处理ddddocr 与 pytesseract 双引擎预处理完成后进入 OCR 环节。我同时准备了两个引擎一个是 ddddocr另一个是 pytesseract。ddddocr 是专门为验证码场景训练的模型对数字字母混合验证码识别率很高调用非常简单import ddddocr ocr ddddocr.DdddOcr(show_adFalse) with open(captcha_processed.png, rb) as f: image f.read() result ocr.classification(image) print(识别结果:, result)ddddocr 的缺点是模型是固定的遇到字体风格变化时准确率会波动。pytesseract 则更通用可以配置识别模式和白名单适合处理清晰但风格多变的字符import pytesseract from PIL import Image text pytesseract.image_to_string( Image.open(captcha_processed.png), config--psm 7 -c tessedit_char_whitelistABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 )psm 7 表示将图片视为一行文本特别适合验证码这种单行字符。白名单限制了只识别字母和数字能排除各种标点符号干扰。两个引擎我会同时跑如果结果一致就直接采用如果不一致再用字符长度过滤和常见混淆规则比如 0 和 O、1 和 l、2 和 Z来做最后决断。后处理这块容易被忽视但它很关键。OCR 识别出的文本可能带空格、带换行、带多余字符一定要做清洗。同花顺验证码通常是四到五个字符所以清洗后如果长度不符合基本可以判定识别失败直接重新刷新验证码再试。3.5 提高识别率的三个细节经验第一个经验是不要盲目追求单次识别率要把“识别失败后重新刷新”纳入整体流程。同花顺验证码可以通过点击验证码图片刷新也可以点击旁边的刷新按钮。我实测下来每次重新截图的识别成功率在 75% 左右但加上了失败后自动刷新重试三次以内成功的概率能到 95% 以上。所以流程设计上验证码识别环节一定要有次数限制和超时退出不能无限重试。第二个经验是保存识别日志。把每次的验证码图片、预处理结果、两个引擎的识别结果、最终采用值全部记录下来。这样做的好处是一旦某个时段识别率下降你可以复盘到底是因为图片质量差、字体变化还是预处理参数失效。我通过日志发现过一次规律下午时段验证码背景噪点明显增多后来调整了高斯模糊的参数才稳住。第三个经验是验证码出现后延迟一小会儿再截图。刚刷新出来的验证码图片如果立刻截图偶尔能截到半渲染状态图片内容不完整。我实测加了个 0.3 到 0.5 秒的等待识别率有明显提升。这种细节不跑上几十次很难发现属于典型的页面渲染时序问题。4. 界面弹窗处理的完整方案4.1 同花顺弹窗类型盘点识别特征与响应策略同花顺客户端的弹窗多到令人发指。我粗略统计了一下整个流程中可能遇到的弹窗种类有十几类登录阶段的风险揭示书、用户协议更新登录后的“推荐股票”营销弹窗、“版本升级提示”、公告通知操作阶段的下单确认、撤单确认、价格偏离风险提示、无持仓确认还有不定时出现的行情推送气泡、系统维护提醒。每种弹窗的标题和按钮文本都不一样有的需要点确定有的需要选是有的需要点关闭。要稳定处理这么多弹窗第一步是建立一张弹窗特征表。每条记录包含弹窗标题正则、按钮文本、处理动作、是否阻塞主流程等字段。比如“风险揭示”这个弹窗标题匹配到之后主流程必须等它消失才能继续处理动作是点击“我已阅读并同意”“推荐股票”弹窗是非阻塞的处理动作是直接关闭。“版本升级”弹窗要特别小心如果点了确定它可能开始下载升级包反而更糟所以动作是点“取消”或“以后再说”。这里容易踩坑的地方在于有些弹窗的标题和按钮文本会随版本更新改变。写死字符串的脚本一旦遇到版本升级弹窗处理模块就失效了。我的做法是把弹窗规则放在一个 JSON 配置文件里文本变更时只改配置不碰代码。这个设计让我在后续同花顺自动更新之后省了很多事。4.2 弹窗监控与自动响应的两种实现方式处理弹窗有两种思路一种是主流程“主动查询”另一种是后台“被动监控”。我一开始用的是主动查询也就是在每个关键操作之后遍历一遍所有顶层窗口看看有没有需要处理的弹窗。这种方式的缺点是逻辑耦合严重主流程里塞满了弹窗判断代码代码可读性很差。后来我改成被动监控专门开一个后台线程每隔 0.3 秒遍历一次桌面所有顶层窗口找到匹配弹窗特征表的窗口就自动执行对应动作。主流程只需要关心自己本来要做的事情弹窗处理完全解耦。这个设计是我整个项目里最值得分享的一个点。代码骨架大致这样import threading import time from pywinauto import Desktop def monitor_popups(stop_event): desktop Desktop(backenduia) rules load_popup_rules(popup_rules.json) processed set() while not stop_event.is_set(): try: windows desktop.windows() for w in windows: title w.window_text() handle w.handle if handle in processed: continue for rule in rules: if rule[title_re] in title or title in rule[title_re]: handle_popup(w, rule) processed.add(handle) break except Exception: pass time.sleep(0.3)processed 集合用来记录已经处理过的窗口句柄防止同一个弹窗被重复处理。这个很关键比如一个弹窗关闭后还没完全消失下一轮巡检又匹配到它就会再次点击导致不必要的误操作。被动监控有个好处它不仅能处理预期内的弹窗还能兜底处理那些意外出现的弹窗。比如有一次同花顺突然弹了一个“连接超时重试”的提示框如果不处理主流程会一直等一个永远不会出现的控件。有了监控线程这种弹窗也能被及时关掉。4.3 弹窗处理中的竞态问题与重试机制弹窗处理最常见的坑就是竞态条件。弹窗刚出现时控件可能还没有完全创建好后台线程立刻去查找按钮就会抛 ElementNotFoundError。这个问题的标准解法是用 pywinauto 的 wait 方法在点击按钮之前先等待按钮 exists 或 visible。同时要包一层 try-except捕获超时异常后继续重试。另一个竞态是弹窗还没完全消失主流程就已经继续往下走结果后续操作因为窗口遮挡而失败。比如下单确认弹窗点完确定后如果立刻去查持仓列表可能因为仓位刷新延迟或弹窗残留导致数据不准确。我的处理方式是在每次关键操作后等待一个确定性条件比如某个状态控件的文本变化、某个按钮可用而不是单纯等待几秒钟。最后说下重试机制。任何一次弹窗点击都不能只试一次我封装了一个带重试的 click 函数最多重试三次每次间隔 0.5 秒。如果三次都失败就记录日志并切换策略比如改用坐标点击。这套重试机制在弹窗处理上看似大材小用实际跑起来却能显著提高整体成功率因为同花顺的弹窗动画和渲染速度在不同机器上差异很大。5. 常见问题与排查技巧实录5.1 控件定位失败print_control_identifiers 的正确用法控件定位失败是我遇到最多的问题基本集中在两类场景。第一类是控件属性为空class_name、title、control_type 全都拿不到第二类是错误地匹配到了同名的隐藏控件。遇到这种情况第一反应用win.print_control_identifiers(depth2)打印控件树看清整个窗口的结构而不是盲目地换一个属性继续猜。打印出来的控件树里你要重点关注 auto_id、control_type、title 这几个字段的组合。同花顺有些按钮 title 是空的但 control_type 是 Buttonauto_id 是唯一标识。有些输入框无法通过标准属性定位但在控件树里能看到它的 class_name 是某个特定值可以拿来做筛选。如果控件树里完全没有目标控件说明它是纯自绘控件这时候只能靠坐标或者图像识别兜底。我还发现一个技巧用child_window()的时候可以同时传多个条件比如 title 和 control_type 一起匹配能大幅降低误匹配概率。但要注意多个条件之间是 AND 关系如果其中一个条件写错了结果就是空集这时候不要怀疑 pywinauto 有问题先逐个条件验证一下。5.2 自绘控件无法识别时的坐标兜底方案同花顺的某些功能按钮比如“买入”“卖出”“撤单”在控件树里完全不存在。我用 uia 后端查看连整个窗口都只有寥寥几个节点这时候只能退回到坐标点击。坐标点击的原理很简单通过窗口矩形和已知参照物的相对比例计算点击位置然后调用win.click(coords(x, y))。这里有个非常重要的细节pywinauto 的 click 坐标是相对于窗口客户区的不是屏幕坐标。而 ImageGrab 截图用的是屏幕坐标所以两套坐标体系需要明确换算。窗口客户区左顶点可以通过win.client_rect()获取再加上相对偏移才是目标控件的位置。我因为坐标算错空跑了一整夜才发现点的地方根本不是目标按钮。坐标兜底虽然能用但它脆弱窗口大小变化、界面布局微调都会让坐标失效。所以我的建议是优先控件定位、其次坐标兜底并且尽量把主窗口最大化固定减少布局变动。如果你愿意再上一层可以用模板匹配的方式找到目标按钮的图像位置然后换算成坐标这样对布局变化的容忍度会高很多。5.3 权限、安全机制与运行稳定性提升同花顺客户端有一定程度的自我保护机制这在桌面自动化中很常见。有几点经验值得分享。第一Python 环境尽量以管理员权限运行否则某些窗口消息会被 UAC 拦截导致 click 操作无效。第二不要高频操作同花顺对异常高频的登录、下单请求有风控策略太激进的话容易触发临时限制。我的做法是在每次操作之间加一个随机延迟比如 0.5 到 1.5 秒之间随机取既保证效率又让行为更接近真人。第三脚本要加完整的日志系统。我用的方案是 Python logging 输出到控制台和文件同时记录每次操作的耗时、控件截图、异常堆栈。排查问题的时候日志和截图能节省大量时间。第四脚本要设计成可中断、可恢复的。自动化跑着跑着可能崩溃如果不能恢复就得从头再来。我的做法是记录状态文件每次关键步骤完成后写入当前状态重启后从状态文件恢复。第五也是最重要的一点任何自动化操作之前务必阅读同花顺的用户协议和相关法律法规。自动化操作证券客户端在特定场景下可能违反软件使用条款甚至触发合规风险。本文所有技术内容仅用于学习和软件测试目的请务必在你合法拥有的测试环境或模拟环境中验证实际作用于真实业务前请咨询专业人士。5.4 常见异常速查表为了方便排查我把实际遇到的高频异常整理成一张速查表遇到问题直接对着查。异常现象可能原因排查与解决方法connect 连接不上同花顺进程名或标题不匹配先打印所有顶层窗口确认实际标题、类名和进程ID控件树为空选错了 backend 或窗口句柄换成 uia 后端或者重新确认连接的窗口是主窗口click 点了没反应窗口最小化/被遮挡/按钮自定义绘制先 activate 窗口再确认坐标是相对客户区必要时截图确认按钮位置验证码识别率突然下降字体风格变化或图片噪点增多保存截图日志调整预处理参数或切换 OCR 引擎弹窗处理重复点击processed 集合未正确记录用窗口句柄做去重弹窗消失后从集合中删除该句柄系统缩放导致坐标偏移未设置 DPI 感知脚本开头调用 SetProcessDPIAware或按 DPI 缩放比例换算坐标操作太频繁被风控请求频率过高增加随机延迟降低操作频率避免短时间内大量重复动作这张表不是一次性列出来的而是我跑了两个多星期、挂了十几次机之后一点点沉淀下来的。每次挂了机我就看日志定位原因然后往表里加一条。做自动化最忌讳的是盲目重试一定要有记录、有复盘、有迭代。6. 实战心得与最终体会整个项目做下来我最深的感触是桌面自动化真正的难点不在“如何写到代码”而在“如何设计容错”。验证码识别和弹窗处理本质上都是容错设计的问题。验证码识别率不可能到 100%你就必须设计重试、刷新、多引擎投票机制弹窗类型不可能完全枚举你就必须设计监控线程、规则配置、去重机制。把这两块做好之后整个流程的稳定性自然会上去。技术选型上pywinauto 作为主框架是没问题的它虽然有一些历史包袱接口设计也不算现代但胜在稳定、社区大、遇到问题搜得到答案。OCR 环节我强烈建议保留双引擎配置ddddocr 和 pytesseract 各有千秋双引擎投票能覆盖大部分识别失败的场景。图像预处理参数不要硬编码在代码里放到配置文件里方便随时调整。同花顺自动化的实战给了我一个非常重要的启发你永远无法预料一个桌面应用在真实运行环境中会有什么行为。网络延迟、系统弹窗、字体渲染、分辨率变化每一个因素都可能导致自动化流程失败。这不是代码能力的问题而是工程化思维的问题。如果你想做类似的项目我的建议是先跑通最小闭环再做日志再做容错再做异常处理。不要一开始就想着把所有功能都实现那样只会让自己陷入无尽的调试泥潭。最后提醒一句自动化你的软件操作之前一定要先了解并遵守软件的用户协议和你所在地的法律法规本文所有内容仅限学习 GUI 自动化技术和软件测试场景使用不构成任何操作指引。工具本身没有对错关键在于使用工具的人把它用在哪里。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →