Appium2插件化架构详解:从环境配置到Python自动化测试实战
1. 项目概述为什么需要Appium2如果你正在看这篇文章大概率是遇到了Appium1.x版本的各种“坑”比如环境配置复杂、依赖冲突、或者想体验更现代的架构。没错Appium2的发布就是为了解决这些问题。它不再是一个庞大的单体应用而是采用了插件化架构把驱动如XCUITest、UiAutomator2和插件如图像识别、OCR都变成了可独立安装的模块。这意味着你的环境可以更干净升级更灵活出了问题也更容易定位。对于使用Python进行移动端自动化测试的工程师来说从Appium1.x迁移到2.x不仅仅是换一个版本号更是一次工作流的优化。本文将带你从零开始完成Appium2服务端、客户端Python的安装、配置并解决你在这个过程中必然会遇到的几个典型问题比如那个令人头疼的[appium] no plugins have been installed提示。我会假设你有一些Python基础但即使你是刚接触自动化测试跟着步骤走也能搞定。2. 环境准备与核心工具选型在开始安装之前我们需要理清整个技术栈。Appium自动化测试主要涉及两部分Appium Server服务端负责与手机设备通信和Appium Client客户端即你的Python测试脚本。此外还需要对应的移动端驱动和必要的系统依赖。2.1 系统与运行时环境检查首先确保你的电脑已经准备好了基础环境。Node.js与npmAppium Server是基于Node.js的所以这是必须的。前往Node.js官网下载LTS长期支持版本安装。安装完成后打开终端Windows用CMD或PowerShellMac/Linux用Terminal输入node -v和npm -v检查版本。我推荐使用Node.js 18或20 LTS版本兼容性最好。Python环境这是我们的脚本语言环境。同样建议使用Python 3.8至3.11之间的版本避免使用太新或太旧的版本可能带来的兼容性问题。你可以从Python官网下载安装或者在Mac/Linux上使用pyenv在Windows上使用官方安装包。安装时务必勾选“Add Python to PATH”这样才能在任意终端调用python命令。Java Development Kit (JDK)如果你要测试Android应用ADBAndroid调试桥和Appium的UiAutomator2驱动需要Java环境。安装JDK 8或JDK 11LTS版本并配置好JAVA_HOME环境变量。在终端输入java -version验证。注意环境变量是新手最容易出错的地方。安装完JDK后需要手动添加系统环境变量JAVA_HOME其值为你的JDK安装路径例如C:\Program Files\Java\jdk-11然后在Path变量中添加%JAVA_HOME%\bin。2.2 包管理工具的选择pip, uv, 与项目依赖管理Python的包管理工具首选的当然是pip。它是Python的官方包管理器绝大多数教程和库都围绕它展开。对于Appium的Python客户端我们使用pip install Appium-Python-Client即可。但这里我想提一下网络热词里出现的uv。这是Rust编写的一个极速Python包管理器和解析器由AstralRuff的团队开发。它的安装速度和依赖解析速度远超传统的pip特别是在创建虚拟环境和处理pyproject.toml时。如果你经常需要初始化新项目或者受困于pip缓慢的依赖解析uv是一个值得尝试的现代化替代品。你可以通过pip install uv来安装它之后用uv pip install Appium-Python-Client来安装包速度会有明显提升。不过对于本教程为了普适性我们仍然使用pip进行演示。但请记住在一个正式的测试项目中强烈建议使用虚拟环境venv来隔离依赖。你可以通过python -m venv venv创建然后用source venv/bin/activateMac/Linux或venv\Scripts\activateWindows激活它再在里面安装Appium客户端这样能保证项目间的环境纯净。3. Appium2服务端的安装与插件化配置这是Appium2与1.x最大的不同之处也是很多同学卡住的地方。在Appium2中核心服务器和驱动是分开的。3.1 安装Appium2核心服务器打开你的终端全局安装Appium2npm install -g appiumnext这里的next标签确保我们安装的是最新的2.x版本。安装完成后输入appium -v来验证安装。如果看到类似2.x.x的版本号说明安装成功。此时如果你直接运行appium命令启动服务器很可能会看到那个经典的警告[Appium] No plugins have been installed. Use the appium plugin command to install the ones you want to use.别担心这不是错误只是一个提示告诉你还没有安装任何执行自动化所必需的“驱动”插件。在Appium2看来连最基本的Android和iOS驱动也都是插件。3.2 安装必备的驱动程序Drivers你需要根据你要测试的平台安装对应的驱动。通常我们需要这两个UiAutomator2驱动用于Android这是目前Android自动化最稳定、功能最全的驱动。XCUITest驱动用于iOS这是苹果官方提供的iOS UI测试框架是测试iOS应用的标准。在终端中分别执行以下命令进行安装# 安装Android的UiAutomator2驱动 appium driver install uiautomator2 # 安装iOS的XCUITest驱动仅在macOS系统上需要 appium driver install xcuitest安装完成后可以使用appium driver list命令来查看已安装的驱动。你会看到uiautomator2和xcuitest如果安装了的状态是installed。3.3 安装可选插件Plugins插件用于扩展Appium的功能。一个非常实用的插件是images插件它提供了基于图像识别的定位能力可以作为辅助定位手段。appium plugin install images同样使用appium plugin list可以查看已安装的插件。现在再次运行appium命令那个“No plugins”的警告就应该消失了。服务会正常启动并显示已安装的驱动和插件信息。你可以通过访问http://localhost:4723来查看Appium服务器的基本状态页面。3.4 驱动与插件的管理技巧更新使用appium driver update [driver-name]或appium plugin update [plugin-name]。卸载使用appium driver uninstall [driver-name]或appium plugin uninstall [plugin-name]。查看详情使用appium driver info uiautomator2可以查看某个驱动的详细信息包括版本和配置项。解决安装慢或失败由于网络原因安装驱动或插件时可能会超时。可以尝试设置npm的镜像源或者使用科学的上网方式。但更直接的方法是检查Appium的日志它通常会给出下载链接你可以手动下载对应的npm包.tgz文件然后使用appium driver install --source local /path/to/package.tgz进行本地安装。4. Python客户端配置与基础脚本编写服务端准备好了现在来配置我们的“遥控器”——Python测试脚本。4.1 安装Appium Python客户端库在你的Python项目虚拟环境中执行pip install Appium-Python-Client这个库提供了Selenium WebDriver的扩展专门用于和Appium Server通信。它会自动安装依赖的selenium包。4.2 编写你的第一个Appium脚本我们来创建一个最简单的脚本用于打开Android手机上的计算器应用以Android为例确保手机已通过USB连接并开启了USB调试模式。创建一个名为first_appium_test.py的文件。from appium import webdriver from appium.options.android import UiAutomator2Options import time # 1. 定义设备能力和App信息 capabilities { “platformName”: “Android” # 平台 “appium:automationName”: “UiAutomator2” # 自动化驱动引擎必须和安装的驱动名一致 “appium:deviceName”: “你的设备名称” # 通过 adb devices 获取或使用通用名称如 Android Emulator “appium:platformVersion”: “13” # 手机系统版本 “appium:appPackage”: “com.android.calculator2” # 计算器App的包名 “appium:appActivity”: “com.android.calculator2.Calculator” # 计算器App的启动Activity “appium:noReset”: True # 不清空App数据便于重复测试 } # 2. 将Capabilities字典转换为Appium2推荐使用的Options对象 appium_options UiAutomator2Options().load_capabilities(capabilities) # 3. 连接Appium服务器并初始化驱动 # 这里的 http://localhost:4723 是Appium Server默认的监听地址 driver webdriver.Remote(“http://localhost:4723” optionsappium_options) # 4. 简单的自动化操作等待2秒然后退出 time.sleep(2) print(“测试完成准备退出。”) # 5. 关闭会话 driver.quit()关键点解析Capabilities这是连接手机和指定待测App的“合同”。每个键值对都有特定含义。automationName必须与你安装的驱动名UiAutomator2严格一致这是Appium2的关键。Options对象在Appium1.x时代我们通常直接传递字典。在Appium2的Python客户端中更推荐使用各平台对应的Options类如UiAutomator2Options,XCUITestOptions。它提供了更好的类型提示和参数校验。设备信息获取deviceName运行adb devices命令列表中显示的名称就是。对于模拟器可以是emulator-5554这类。appPackage和appActivity对于系统应用可以网上搜索。对于自己开发或已安装的应用可以通过adb shell dumpsys window | findstr mCurrentFocusWindows或adb shell dumpsys window | grep mCurrentFocusMac/Linux来查看当前前台应用的包名和Activity。4.3 脚本执行与调试确保Appium服务器正在运行终端里appium命令在运行。确保手机已连接adb devices能看到你的设备。在另一个终端激活你的Python虚拟环境运行python first_appium_test.py。如果一切顺利你会看到手机上的计算器应用被自动打开等待2秒后关闭。控制台会打印“测试完成准备退出。”。5. 核心问题排查与实战技巧在实际操作中你几乎一定会遇到下面这些问题。我把它们和解决方案整理成了表格方便你快速查阅。5.1 安装与启动常见问题问题现象可能原因解决方案运行appium提示command not foundNode.js或npm未正确安装或全局路径未配置。1. 检查node -v和npm -v。2. 重新安装Node.js并确保安装时勾选了“添加到PATH”。3. 有时需要重启终端或电脑。安装驱动/插件极慢或失败网络连接问题。1. 检查网络。2. 可尝试更换npm镜像源npm config set registry https://registry.npmmirror.com。3. 如前述尝试手动下载安装包进行本地安装。[Appium] No plugins have been installed这是正常提示说明未安装任何驱动。使用appium driver install uiautomator2等命令安装所需驱动。安装后警告即消失。启动Appium后无法访问http://localhost:4723端口被占用或服务器未成功监听。1. 检查是否有其他Appium或服务占用了4723端口。2. 尝试指定其他端口启动appium -p 4724。3. 查看Appium启动日志是否有错误。5.2 脚本运行常见问题问题现象可能原因解决方案WebDriverException: Unable to create new service: XCUITestService在非macOS系统上尝试测试iOS应用或未安装XCUITest驱动。1. XCUITest驱动仅支持macOS。2. 在macOS上确保已执行appium driver install xcuitest。WebDriverException: An unknown server-side error occurred while processing the commandCapabilities配置错误或Appium驱动内部问题。1.首先检查CapabilitiesautomationName是否拼写正确大小写敏感。appium:前缀在纯字典格式中是否需要新版Client可能自动处理。2. 查看Appium服务端日志错误详情通常在日志末尾。这是最重要的调试依据。脚本找不到元素NoSuchElementException元素定位符如id, xpath写错或页面尚未加载完成。1. 使用Appium Desktop或浏览器开发者工具对于WebView复核元素属性。2. 添加显式等待WebDriverWait确保元素出现后再操作。3. 尝试其他定位策略如 accessibility id。连接被拒绝 (ConnectionRefusedError)Appium服务器未启动或脚本中连接的地址/端口错误。1. 确保在运行脚本前已经在一个终端窗口启动了appium。2. 检查脚本中webdriver.Remote的URL是否与服务器启动的地址端口一致。5.3 独家实操心得让脚本更健壮一定要看服务端日志90%的问题都能在Appium Server的运行终端里找到答案。错误信息、堆栈跟踪非常详细。养成脚本报错时第一时间查看服务端日志的习惯。使用显式等待告别sleeptime.sleep(2)是固定等待效率低下且不可靠。使用WebDriverWait配合expected_conditions是行业最佳实践。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 等待最多10秒直到ID为‘com.example:id/button’的元素可点击 element WebDriverWait(driver, 10).until( EC.element_to_be_clickable((AppiumBy.ID, “com.example:id/button”)) ) element.click()Capabilities管理将Capabilities写在单独的配置文件如config.yaml或config.json中或者使用Python的字典在不同测试间复用和切换如区分Android和iOS的配置会让你的代码更清晰。设备连接稳定性USB连接有时会不稳定导致adb设备列表变化。可以尝试使用无线ADB连接adb tcpip 5555adb connect 设备IP或者使用STFSmartphone Test Farm等设备管理平台进行远程真机测试。6. 进阶与AirtestPoco框架的浅析与选择网络热词中提到了“appium和airtestpoco框架哪个做这种自动遍历app梳理业务功能”。这是一个很好的问题涉及到框架选型。Appium基于WebDriver协议标准是它的核心优势。它使用原生控件的定位方式如ID、XPath脚本可读性和可维护性高与Selenium生态无缝集成适合需要精确控件操作、断言逻辑复杂、与Web测试共用技术栈的功能自动化测试和回归测试。它的遍历需要你编写明确的查找和点击逻辑。AirtestPoco这是一个更偏向于图像识别和游戏测试的解决方案。Airtest基于图像识别进行“点击”不关心控件结构Poco则提供了类似Appium的控件定位能力但专为游戏引擎Unity3D, Cocos2dx和部分原生App优化。对于“自动遍历”Airtest的图像识别可以更容易地实现“看到什么点什么的”的盲遍历而Poco则需要像Appium一样理解UI树。如何选择如果你的App是标准的原生或混合应用测试逻辑需要精细的控件定位和验证团队熟悉Selenium选择Appium。如果你的测试对象包含大量游戏、或UI控件树难以获取如一些Flutter应用、或者核心需求是快速实现“瞎点”式的遍历探索可以优先评估AirtestPoco。实际上两者并非完全互斥。在一些复杂场景中也有团队混合使用例如用Appium处理主要业务流程用Airtest处理其中的图像验证码。7. 集成开发环境IDE配置与效率提升工欲善其事必先利其器。一个好的IDE能极大提升编写和调试Appium脚本的效率。7.1 VS Code配置Python与Appium环境安装Python扩展在VS Code扩展商店搜索并安装官方“Python”扩展它提供了智能提示、调试、格式化等全套功能。选择解释器按CtrlShiftP输入 “Python: Select Interpreter”选择你创建了虚拟环境的Python解释器路径通常包含venv字样。安装Pylance推荐作为Python的语言服务器它能提供更强大的代码补全和类型检查。在虚拟环境中你的Appium-Python-Client库的代码提示就会生效。查看函数参数将光标放在函数如webdriver.Remote上VS Code会自动显示其参数签名。这也是热词中“vscode查看函数参数python”的答案。7.2 使用PyCharm的专业功能PyCharm是专为Python设计的IDE开箱即用体验更好。创建项目时直接创建虚拟环境在新建项目对话框中可以直接选择“New environment using Virtualenv”。强大的运行/调试配置你可以创建一个运行配置固定你的测试脚本路径、参数和环境变量一键运行或调试。图形化的调试工具设置断点、查看变量、单步执行对于分析复杂的自动化脚本流程非常有用。我个人习惯是快速原型和小项目用VS Code因为它轻量、启动快大型的、复杂的自动化测试项目用PyCharm因为它对项目结构、重构和调试的支持更深入。7.3 编写可维护的测试脚本不要把所有代码都写在一个文件里。随着测试用例增多你需要考虑架构。Page Object Model (POM)这是UI自动化的经典设计模式。将每个App页面封装成一个类页面上的元素和操作作为这个类的方法。测试脚本只调用这些方法不直接包含定位符。这样当UI变化时你只需要修改对应的Page类测试脚本几乎不用动。使用pytest框架pytest比Python自带的unittest更简洁、功能更强大。它支持丰富的夹具fixture你可以用夹具来管理driver的生命周期启动、退出。# conftest.py import pytest from appium import webdriver from appium.options.android import UiAutomator2Options pytest.fixture def driver(): options UiAutomator2Options().load_capabilities({...}) _driver webdriver.Remote(“http://localhost:4723” optionsoptions) yield _driver # 测试函数执行时使用这个driver _driver.quit() # 测试函数执行完后退出 # test_calculator.py def test_add_function(driver): # 将fixture作为参数传入 # 直接使用driver进行测试 el driver.find_element(...) el.click() assert ...配置文件与常量分离将设备Capabilities、App信息、服务器地址、等待超时时间等放入配置文件如config.yaml或常量文件中。从在终端里敲下npm install -g appiumnext开始到写出一个稳定运行的POM模式测试用例这个过程你会遇到很多细节问题。但只要你理解了Appium2的插件化架构核心掌握了Capabilities的正确配置方法并学会了从服务端日志中寻找答案这些问题都会迎刃而解。移动端自动化测试是一个需要耐心和细致的工作每一个稳定的测试脚本背后都是对无数个异常情况的处理和优化。开始动手吧从让你的手机自动打开第一个App开始。

相关新闻

AI视频教学质量断崖式提升秘籍,深度拆解Top 3教育机构私有工作流,含Prompt工程模板库

AI视频教学质量断崖式提升秘籍,深度拆解Top 3教育机构私有工作流,含Prompt工程模板库

更多请点击: https://kaifayun.com 第一章:AI视频教学的核心价值与行业现状 AI视频教学正以前所未有的深度和广度重塑教育内容生产与知识传递范式。它不再局限于简单剪辑或字幕叠加,而是融合多模态理解、语音合成、行为识别与个性化推荐等能…

2026/7/22 13:38:16阅读更多 →
RAG系统智能索引设计与优化实践

RAG系统智能索引设计与优化实践

1. RAG系统优化概述检索增强生成(Retrieval-Augmented Generation,简称RAG)技术正在成为AI领域的热门话题。作为一名长期从事NLP系统开发的工程师,我发现RAG系统在实际应用中最大的瓶颈往往出现在索引设计环节。一个优秀的智能索引…

2026/7/22 13:36:15阅读更多 →
ElectronBot桌面机器人:从开源硬件到智能交互的技术探索之路

ElectronBot桌面机器人:从开源硬件到智能交互的技术探索之路

ElectronBot桌面机器人:从开源硬件到智能交互的技术探索之路 【免费下载链接】ElectronBot 项目地址: https://gitcode.com/gh_mirrors/el/ElectronBot 在桌面机器人领域,如何平衡紧凑体积、丰富功能与开发友好性一直是个技术难题。ElectronBot项…

2026/7/22 13:36:15阅读更多 →
基础版 动手组装一台个人电脑,看完你也是装机高手。

基础版 动手组装一台个人电脑,看完你也是装机高手。

1. 前言:装机前的准备工作 在开始动手组装一台个人电脑之前,做好充分的准备工作是成功的第一步。这不仅能让装机过程更顺畅,也能有效避免因疏忽造成的硬件损坏。 你需要准备的工具和物品: 十字螺丝刀:一把磁性螺丝刀会…

2026/7/22 14:36:30阅读更多 →
GPT-5.6 代码上下文处理指南:常见问题与关键细节解析

GPT-5.6 代码上下文处理指南:常见问题与关键细节解析

之前在kulaai(titiai.cn)上看了各模型写代码的横评数据,自己动手测了一把GPT-5.6的代码上下文处理能力。用了大半年,踩了不少坑,也总结出了一些关键细节。今天把常见问题和解决方案整理出来,帮开发者少走弯…

2026/7/22 14:36:30阅读更多 →
混合验证码识别:dddd_trainer实战与优化技巧

混合验证码识别:dddd_trainer实战与优化技巧

1. 项目背景与挑战 某保险公司官网采用了一种混合型算术验证码,这种验证码系统由三个关键元素组成:繁体中文数字、阿拉伯数字和数学运算符。这种设计显著提升了自动化程序破解的难度,同时也给正常用户识别带来了一定困扰。 在实际测试中&…

2026/7/22 14:36:30阅读更多 →
2026 GPT-5.6 选型全攻略:Sol、Terra、Luna 区别及开发实践

2026 GPT-5.6 选型全攻略:Sol、Terra、Luna 区别及开发实践

之前在kulaai(titiai.cn)上看了各模型写代码的横评数据,自己动手测了一把GPT-5.6的三档模型。用了大半年,今天把Sol、Terra、Luna的能力差异、成本对比、适用场景和开发实践整理出来,帮你选对档位不花冤枉钱。 一、三…

2026/7/22 14:36:30阅读更多 →
【鸿蒙应用】包体积优化新特性

【鸿蒙应用】包体积优化新特性

背景 ArkTS编译器在6.1.1上,对编译器进行了优化,对string section及code section进行了大幅的去冗余优化,对abc size的减小有不错的效果。 升级方案一 升级6.1.1 Release或以上最新版本的Command Line Tools/DevEco Studio,使用该…

2026/7/22 14:36:30阅读更多 →
深入解析TI N2HET核心指令:ECMP、ECNT与MCMP的嵌入式实时控制应用

深入解析TI N2HET核心指令:ECMP、ECNT与MCMP的嵌入式实时控制应用

1. 项目概述与N2HET模块定位在嵌入式实时控制领域,尤其是汽车电子、电机驱动和工业自动化这些对时序精度要求达到纳秒级的场景里,软件模拟的延时或者通用定时器往往力不从心。你需要一个能够独立于CPU核心、以硬件确定性执行复杂时序逻辑的“协处理器”。…

2026/7/22 14:34:30阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

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

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

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

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/21 18:53:30阅读更多 →