内网环境Python Playwright自动化测试离线部署实战指南
1. 项目概述内网自动化测试的独特挑战与Playwright的破局之道在金融、军工、政府或大型企业内部我们常常需要面对一个特殊的开发与测试环境——内网。这个环境与互联网物理隔离无法直接访问外部的软件仓库、镜像源和依赖库。当团队决定引入Playwright这样的现代Web自动化测试框架时挑战就来了如何在无法连接外网的生产或测试服务器上完成从Python环境、Playwright库到浏览器驱动的完整部署这不仅仅是“安装一个包”那么简单它涉及到依赖的离线打包、环境的一致性保障、以及后续的维护更新策略。我经历过多次这样的部署从最初的“手动搬运”到后来的“一键脚本化”踩过不少坑也总结了一套相对成熟的方案。这篇文章我就来详细拆解一下如何在内网环境中从零开始部署一套稳定、可维护的Python Playwright自动化测试环境。无论你是测试开发工程师、运维还是需要在内网进行CI/CD集成的开发者这套实战经验都能帮你省去大量摸索的时间。2. 内网部署的核心思路与方案设计2.1 为什么内网部署Playwright比Selenium更复杂很多朋友可能熟悉Selenium觉得内网部署无非就是下载个浏览器驱动如chromedriver放到PATH里。但Playwright的架构决定了它的部署更“重”一些。Playwright采用客户端-服务器架构其Python库playwright只是一个客户端真正的“引擎”是它自带的、特定版本的浏览器二进制文件Chromium, Firefox, WebKit以及一个名为playwright-driver的服务器进程。当你执行pip install playwright时pip不仅会安装Python包还会在后台自动下载这些浏览器二进制文件到用户目录如~/.cache/ms-playwright。在内网环境下这个自动下载步骤注定会失败。因此我们的核心思路就是将所有依赖Python包、浏览器二进制文件在能上网的机器上预先准备好然后完整地搬运到内网机器上。2.2 整体部署方案选型针对内网部署主要有两种主流方案方案一离线Wheel包 手动安装浏览器驱动思路在能上网的机器上将playwright及其依赖包下载为.whl文件。同时使用playwright install命令下载浏览器驱动然后将这两部分一起拷贝到内网。优点步骤清晰接近标准安装流程易于理解。缺点需要手动管理浏览器驱动的路径容易因路径问题导致失败。方案二使用playwright命令行工具打包思路利用Playwright官方提供的CLI工具直接打包一个包含所有依赖包括Python包和浏览器的独立目录或可执行文件。优点官方推荐打包结果更完整、独立对环境依赖最小。缺点需要了解CLI工具的使用打包文件体积较大。经过多次实践我强烈推荐方案二。它不仅更可靠而且能更好地处理浏览器驱动的版本匹配问题这是内网部署中最容易出错的地方。本文将重点围绕方案二展开并补充方案一作为备选或理解之用。2.3 环境与工具准备清单在开始之前请确保你拥有以下条件一台能连接互联网的“打包机”操作系统最好与内网目标机器一致如都是Linux x64至少架构要相同如都是x86_64或arm64。内网目标机器已安装Python版本需与打包机一致或兼容建议使用3.8。网络存储或移动介质用于将打包好的文件从打包机传输到内网机。基础命令行操作知识。3. 核心部署流程详解从外网打包到内网落地3.1 阶段一在外网打包机上进行完整打包这个阶段的目标是创建一个包含所有运行时依赖的“绿色版”Playwright环境。步骤1在打包机上创建纯净的虚拟环境并安装Playwright为了避免将打包机上的其他包依赖混入使用虚拟环境是必须的。# 创建并激活虚拟环境 python -m venv playwright-offline-pack cd playwright-offline-pack source bin/activate # Linux/macOS # 对于Windows: playwright-offline-pack\Scripts\activate # 升级pip pip install --upgrade pip # 安装playwright pip install playwright注意这里直接pip install playwright会让pip从PyPI下载并自动安装浏览器。我们正是要利用这个特性在打包机完成所有下载。步骤2验证安装并记录版本信息安装完成后运行一个简单命令验证并记录下关键版本这对后续排查问题至关重要。python -c “import playwright; print(playwright.__version__)” playwright --version记下输出的Playwright版本号例如1.40.0。步骤3使用Playwright CLI进行离线打包这是最关键的一步。Playwright提供了一个playwright install命令的--with-deps选项但它主要用于安装。对于完整离线打包我们需要手动定位并复制其缓存目录。# 找到Playwright的浏览器缓存目录通常位于用户目录下 # Linux/macOS: ~/.cache/ms-playwright # Windows: %USERPROFILE%\AppData\Local\ms-playwright # 假设我们在用户目录下操作 cd ~ # 创建一个用于存放所有离线文件的目录 mkdir -p playwright-offline-bundle cd playwright-offline-bundle # 1. 导出已安装的Python包列表 pip freeze requirements.txt # 2. 下载所有依赖包的wheel文件到本地目录 ./wheels pip download -r requirements.txt -d ./wheels # 3. 复制Playwright的浏览器缓存目录 cp -r ~/.cache/ms-playwright ./ # Windows 对应命令为: xcopy /E %USERPROFILE%\AppData\Local\ms-playwright ms-playwright现在你的playwright-offline-bundle目录结构应该类似于playwright-offline-bundle/ ├── requirements.txt ├── wheels/ │ ├── playwright-1.40.0-py3-none-any.whl │ ├── greenlet-2.0.2-cp38-cp38-manylinux_x86_64.whl │ └── ... (其他依赖包) └── ms-playwright/ ├── chromium-1084/ ├── firefox-1391/ ├── webkit-1881/ └── playwright-driver-1.40.0/步骤4创建部署脚本为了让内网安装过程自动化我们编写一个安装脚本install_offline.sh(Linux) 或install_offline.bat(Windows)。Linux安装脚本示例 (install_offline.sh):#!/bin/bash set -e # 遇到错误立即退出 echo “开始在内网环境安装Playwright离线包...” # 定义目录 WHEELS_DIR“./wheels” PLAYWRIGHT_CACHE_SOURCE“./ms-playwright” PLAYWRIGHT_CACHE_TARGET“${HOME}/.cache/ms-playwright” # 1. 安装所有wheel包 echo “安装Python依赖包...” pip install --no-index --find-links${WHEELS_DIR} -r requirements.txt # 2. 部署浏览器二进制文件到缓存目录 echo “部署浏览器驱动...” mkdir -p “${PLAYWRIGHT_CACHE_TARGET}” cp -r “${PLAYWRIGHT_CACHE_SOURCE}”/* “${PLAYWRIGHT_CACHE_TARGET}”/ # 3. 验证安装 echo “验证Playwright安装...” python -c “import playwright; print(f‘Playwright版本: {playwright.__version__}’)” playwright --version echo “Playwright离线安装完成你可以运行 ‘playwright install’ 来验证浏览器驱动此步骤在内网通常跳过因为已拷贝。”Windows安装脚本示例 (install_offline.bat):echo off echo 开始在内网环境安装Playwright离线包... set WHEELS_DIR.\wheels set PLAYWRIGHT_CACHE_SOURCE.\ms-playwright set PLAYWRIGHT_CACHE_TARGET%USERPROFILE%\AppData\Local\ms-playwright echo 安装Python依赖包... pip install --no-index --find-links%WHEELS_DIR% -r requirements.txt echo 部署浏览器驱动... if not exist “%PLAYWRIGHT_CACHE_TARGET%” mkdir “%PLAYWRIGHT_CACHE_TARGET%” xcopy /E /Y “%PLAYWRIGHT_CACHE_SOURCE%” “%PLAYWRIGHT_CACHE_TARGET%\” echo 验证Playwright安装... python -c “import playwright; print(f‘Playwright版本: {playwright.__version__}’)” playwright --version echo Playwright离线安装完成 pause将这两个脚本也放入playwright-offline-bundle目录。至此打包机上的工作完成。将整个playwright-offline-bundle目录压缩通过内部网络或U盘拷贝到内网目标机器。3.2 阶段二在内网目标机器上进行部署步骤1传输与解压将压缩包传到内网机器并解压到合适目录例如/opt/playwright-offline。步骤2执行部署脚本进入解压后的目录执行对应的安装脚本。# Linux cd /opt/playwright-offline chmod x install_offline.sh ./install_offline.sh # Windows (以管理员身份打开CMD或PowerShell) cd C:\path\to\playwright-offline install_offline.bat脚本会自动完成所有包的安装和浏览器驱动的部署。步骤3功能验证部署完成后强烈建议编写一个最简单的测试脚本进行验证而不是直接跑复杂的业务用例。创建一个文件test_internal.pyfrom playwright.sync_api import sync_playwright def test_basic(): with sync_playwright() as p: # 尝试启动无头模式的Chromium browser p.chromium.launch(headlessTrue) page browser.new_page() # 尝试访问一个本地服务或已知的内网地址如果纯粹测试框架可以访问 about:blank page.goto(‘about:blank’) title page.title() print(f“页面标题: {title}”) browser.close() print(“基础功能测试通过”) if __name__ “__main__”: test_basic()运行这个脚本python test_internal.py如果看到“基础功能测试通过”恭喜你最核心的框架部署已经成功。4. 进阶配置与最佳实践4.1 浏览器驱动的版本管理与更新内网环境最大的痛点之一是更新。Playwright版本和浏览器驱动版本是强绑定的。当你需要升级时必须在打包机上重复“阶段一”的过程生成新版本的离线包然后在内网进行替换。我的经验是在项目的README或部署文档中明确记录当前内网环境使用的Playwright版本号、以及对应的浏览器驱动版本可以在ms-playwright目录下的子目录名中看到。升级时务必先在测试环境验证新版本与现有自动化测试用例的兼容性。4.2 集成到内网CI/CD流水线部署好环境后下一步就是让自动化测试跑起来。在内网Jenkins或GitLab CI上运行Playwright脚本需要注意几点环境变量确保CI节点的PATH包含了Python和Playwright驱动所在路径。有时需要显式设置PLAYWRIGHT_BROWSERS_PATH环境变量指向你部署的ms-playwright目录但这在我们的部署脚本中通过复制到默认缓存目录已经解决。无头模式与显示服务器Linux CI服务器通常没有图形界面。Playwright支持无头模式headlessTrue这是默认行为可以直接运行。但如果你的测试涉及截图对比等需要渲染的功能可能需要一个虚拟显示服务器如xvfb。# 在Jenkins Pipeline的步骤中 sh ‘xvfb-run --auto-servernum --server-args“-screen 0 1280x1024x24” python your_test_script.py’依赖隔离为每个CI项目使用独立的Python虚拟环境避免包冲突。我们的离线包可以安装到项目的虚拟环境中。4.3 处理内网特有的页面与认证内网应用常常有复杂的登录认证如域认证、统一SSO。Playwright提供了强大的上下文ContextAPI来处理这类场景。存储状态复用你可以先在本地或一个认证服务器用脚本完成一次登录然后将浏览器上下文的状态cookies, localStorage保存下来。# 登录并保存状态 context browser.new_context() page context.new_page() # ... 执行登录操作 context.storage_state(path“auth.json”)在内网CI中可以预先准备好这个auth.json文件注意安全然后在测试开始时加载。# 加载认证状态 context browser.new_context(storage_state“auth.json”) page context.new_page() # 此时页面已处于登录状态HTTP认证如果网站使用基础HTTP认证可以在URL中直接携带或使用page.goto的extra_http_headers参数但更安全的方式是在创建上下文时配置。context browser.new_context( http_credentials{“username”: “user”, “password”: “pass”} )5. 常见问题与故障排查实录在内网部署过程中你几乎一定会遇到下面这些问题。这里我把踩过的坑和解决方案整理出来希望能帮你快速定位。5.1 浏览器启动失败或找不到这是最常见的问题通常表现为Error: Failed to launch browser或Executable doesn‘t exist at ...。问题原因1浏览器驱动未正确部署排查检查内网机器上~/.cache/ms-playwright(或对应Windows路径) 目录是否存在并且里面的子目录如chromium-1084是否完整。对比文件大小和数量与外网打包机是否一致。解决确保部署脚本中的复制命令执行成功并且有足够的权限。对于Linux注意.cache目录的权限问题有时需要手动chmod -R。问题原因2动态库缺失Linux常见排查Playwright的Chromium依赖一些系统库如libnss3,libatk-bridge2.0-0等。在内网最小化安装的Linux服务器上可能缺失。解决在打包机上使用ldd命令检查依赖然后在内网机安装对应包。或者更推荐使用Playwright的Docker镜像作为CI运行环境它能完美解决依赖问题。在内网部署私有Docker Registry并拉取mcr.microsoft.com/playwright/python镜像是更一劳永逸的方案。问题原因3权限问题排查浏览器二进制文件需要可执行权限。解决进入ms-playwright下的浏览器目录执行chmod -R x .确保所有文件有执行权限。5.2 Python包安装失败问题原因wheel文件与平台不兼容排查pip install时报错包含 “…none-any.whl is not a supported wheel on this platform.” 或类似信息。解决这通常是因为打包机如macOS和内网机如Linux操作系统或架构不同。务必保证打包环境与目标环境一致。最稳妥的方法是在一台与内网机系统版本完全一致或至少是相同架构的Linux发行版的机器上做打包。5.3 测试运行时超时或卡死问题原因1内网代理或防火墙排查即使访问about:blank或本地localhost也超时。解决Playwright启动浏览器时可能会尝试连接某些谷歌服务如崩溃报告。在内网需要禁用这些。通过浏览器启动参数设置browser p.chromium.launch( headlessTrue, args[‘--no-sandbox‘, ‘--disable-dev-shm-usage‘, ‘--disable-gpu‘, ‘--disable-setuid-sandbox‘, ‘--no-zygote‘, ‘--disable-featuresNetworkService‘] )--disable-featuresNetworkService在某些网络严格受限的环境下可能有帮助。问题原因2资源不足排查内网测试服务器内存或CPU资源紧张。解决限制Playwright使用的资源。可以尝试禁用GPU加速、减少并发测试数或者使用更轻量的浏览器如WebKit通常比Chromium内存占用小。5.4 如何验证所有浏览器都可用部署完成后运行一个简单的检查脚本from playwright.sync_api import sync_playwright def check_browsers(): with sync_playwright() as p: for browser_type in [p.chromium, p.firefox, p.webkit]: try: print(f“正在检查 {browser_type.name}...”) browser browser_type.launch(headlessTrue, timeout30000) page browser.new_page() page.goto(‘about:blank’) browser.close() print(f“ {browser_type.name} 检查通过”) except Exception as e: print(f“ {browser_type.name} 检查失败: {e}”) if __name__ “__main__”: check_browsers()6. 备选方案与优化建议6.1 方案一的补充使用pip download和playwright install --dry-run如果你坚持使用方案一离线wheel手动安装驱动可以更精确地控制浏览器版本。# 在打包机 pip download playwright -d ./wheels # 下载特定版本的浏览器驱动 playwright install --dry-run chromium # 这会输出下载链接你可以用内网下载工具提前下好 # 然后手动组织目录结构通过环境变量 PLAYWRIGHT_BROWSERS_PATH0 playwright install 来指向离线目录这种方法更繁琐且容易因版本细微差异导致问题仅作为对方案理解或特殊需求下的备选。6.2 容器化部署终极解决方案对于有条件的内网环境使用Docker是最佳实践。微软官方提供了Playwright的Python镜像。在外网拉取镜像docker pull mcr.microsoft.com/playwright/python:v1.40.0将镜像保存为文件docker save -o playwright-python.tar mcr.microsoft.com/playwright/python:v1.40.0将tar文件导入内网Dockerdocker load -i playwright-python.tar在CI中直接使用该镜像作为运行环境。这种方式完美解决了系统依赖、环境隔离和版本一致性问题是团队协作和持续集成的首选。6.3 编写一个健壮的内网部署脚手架对于需要频繁在多台内网机器部署的场景可以将上述所有步骤脚本化形成一个脚手架工具。这个工具应该包含版本检查与提示。依赖的系统包检查针对Linux。备份旧版本和回滚功能。部署后自动运行健康检查测试。内网部署Playwright自动化测试环境核心在于“离线化”和“一致性”。通过在外网机器预先打包完整的运行时环境Python包浏览器驱动并在内网通过脚本化方式部署可以构建一个稳定可靠的测试基础。过程中最需要关注的是环境一致性操作系统、架构和浏览器驱动的完整性。当环境搭建起来后结合Playwright强大的API和上下文管理能力即使面对复杂的内网认证应用也能构建出高效的自动化测试体系。

相关新闻

SMUDebugTool:解锁AMD Ryzen处理器潜能的免费调试神器

SMUDebugTool:解锁AMD Ryzen处理器潜能的免费调试神器

SMUDebugTool:解锁AMD Ryzen处理器潜能的免费调试神器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

2026/7/2 11:25:08阅读更多 →
GBase 8c集中式版本备份策略定制及操作流程解析

GBase 8c集中式版本备份策略定制及操作流程解析

一、整体功能说明本方案面向 GBase 8c 集中式版本数据库,构建一套标准化、可落地的集中式备份运维体系,完整覆盖本地备份、远程异地备份两大部署场景,同时提供逻辑备份、物理备份两套技术路线,配套自动化脚本、定时调度、过期清理…

2026/7/2 11:25:08阅读更多 →
生成式AI驱动的银行碳账户:从行为反馈到金融激励

生成式AI驱动的银行碳账户:从行为反馈到金融激励

1. 项目概述:当银行App开始“算碳账”,这不只是技术升级,而是金融逻辑的重构“地球的资源足以满足我们的需要,却不足以填满我们的贪婪。”——甘地这句话被印在无数环保报告的首页,但真正把它变成可执行动作的&#xf…

2026/7/2 11:25:08阅读更多 →
rust语言学习笔记(指针六)Cell<T>(内部可变(非指针))

rust语言学习笔记(指针六)Cell<T>(内部可变(非指针))

允许你在拥有不可变引用(&T)的情况下修改内部数据,从而绕过 Rust 严格的借用规则限制。Rust 的默认规则是:‌要么有一个可变引用 (&mut T),要么有多个不可变引用 (&T),但不能同时存在。 6.1 关…

2026/7/2 12:55:26阅读更多 →
终极BetterNCM安装指南:3分钟完成网易云插件自动化部署

终极BetterNCM安装指南:3分钟完成网易云插件自动化部署

终极BetterNCM安装指南:3分钟完成网易云插件自动化部署 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的繁琐流程而头疼吗?每次手动查…

2026/7/2 12:55:26阅读更多 →
家用高压豆浆机推荐哪种好用?优先看材质还是功能

家用高压豆浆机推荐哪种好用?优先看材质还是功能

在早餐桌上升起一碗热气腾腾的豆浆,是许多家庭向往的健康生活场景。但市面上的豆浆机、破壁机、豆奶机品类繁多,从几十元的入门款到上千元的高端款,功能参数让人眼花缭乱。很多人在选购时陷入两难:到底该优先看材质,还…

2026/7/2 12:55:26阅读更多 →
软考机考全流程压力测试实录(模拟断网/断电/进程崩溃):20年命题组技术顾问独家复盘,仅开放给考前最后一次模考人群

软考机考全流程压力测试实录(模拟断网/断电/进程崩溃):20年命题组技术顾问独家复盘,仅开放给考前最后一次模考人群

更多请点击: https://codechina.net 第一章:软考机考全流程压力测试实录(模拟断网/断电/进程崩溃):20年命题组技术顾问独家复盘,仅开放给考前最后一次模考人群 真实考场环境下的三重故障注入策略 为逼近极…

2026/7/2 12:55:26阅读更多 →
基于LARA-R6001与PIC18F86J16的VoLTE通信平台开发指南

基于LARA-R6001与PIC18F86J16的VoLTE通信平台开发指南

1. 4G LTE VoLTE平台开发概述 在物联网和移动通信技术快速发展的今天,构建自主可控的4G LTE VoLTE通信平台成为许多开发者的实际需求。LARA-R6001作为一款成熟的4G LTE模块,配合PIC18F86J16微控制器的强大处理能力,可以搭建出性能稳定、功能完…

2026/7/2 12:55:26阅读更多 →
TranslucentTB终极指南:彻底释放Windows任务栏的美学潜能

TranslucentTB终极指南:彻底释放Windows任务栏的美学潜能

TranslucentTB终极指南:彻底释放Windows任务栏的美学潜能 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否曾对Windows任…

2026/7/2 12:50:25阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想在《塞尔达传说:旷野之息…

2026/7/2 0:03:01阅读更多 →
告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

在本地开发环境使用云厂商 CLI 时,传统的 AccessKey(AK)方式需要手动创建、下载和保管密钥,不仅繁琐,还存在泄漏风险。其实,主流云平台都已提供基于 OAuth 2.0 的免密认证方案,让开发者可以通过浏览器登录一次性完成授权,CLI 自动管理临时凭证的刷新,兼顾了便利与安全…

2026/7/2 0:03:01阅读更多 →
基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

1. 项目背景与核心价值在嵌入式系统开发领域,高精度定位与导航一直是极具挑战性的技术方向。传统方案往往面临成本、精度和实时性难以兼顾的困境。这个项目通过13DOF(13自由度)传感器组合与PIC32MZ2048EFH100高性能MCU的协同工作,…

2026/7/2 0:03:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/2 0:33:58阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/2 1:32:11阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/2 1:50:13阅读更多 →