Selenium vs Playwright vs Cypress:2024年Web自动化测试框架选型实战指南

📅 2026/7/1 20:55:04
Selenium vs Playwright vs Cypress:2024年Web自动化测试框架选型实战指南
1. 项目概述Web自动化测试的十字路口最近在技术社区和团队内部关于Web自动化测试框架的讨论又热了起来。核心的争论点很明确统治了市场十多年的老牌王者Selenium是不是真的要被后起之秀Playwright和Cypress取代了作为一个从Selenium 2.0时代就开始折腾Web自动化的老测试我见证了从WebDriver协议诞生到各种封装框架的百花齐放。现在当项目面临技术栈升级或新自动化体系建设时这个问题无法回避我们到底该押注谁这不仅仅是选择一个工具那么简单。它关系到未来2-3年团队的技术债务、测试用例的维护成本、以及应对日益复杂的现代Web应用单页应用、懒加载、Shadow DOM等的能力。Selenium凭借其广泛的浏览器支持、多语言绑定和庞大的社区依然是许多企业的默认选择。但它的慢速、不稳定的等待机制以及对动态内容处理的笨拙也让无数自动化工程师在深夜调试时头疼不已。与此同时Playwright和Cypress以颠覆者的姿态出现它们宣称解决了Selenium的诸多痛点。Playwright由微软出品主打跨浏览器、跨平台且支持移动端模拟其强大的自动等待和网络拦截能力让人眼前一亮。Cypress则走了另一条路它运行在浏览器内部提供了无与伦比的调试体验和实时重载特别适合前端开发人员进行测试驱动开发。所以这篇文章不是一篇简单的功能对比列表。我会结合我近期在两个真实项目中分别使用Playwright和Cypress进行自动化重构的实战经验从架构原理、开发体验、执行稳定性、维护成本等多个维度进行一次深度的“解剖式”对比。目标只有一个帮你理清思路看清在2024年这个时间点谁更有可能成为你下一个项目的“Web自动化之王”。2. 核心架构与设计哲学对比要理解一个框架为什么好用或者难用必须从它的设计哲学和底层架构说起。这决定了它的能力边界和最佳适用场景。2.1 Selenium协议驱动与标准化的奠基者Selenium的核心是WebDriver协议这是一个W3C推荐标准。它的工作模式是“客户端-服务器”架构。你的测试脚本用Python、Java等编写作为客户端通过特定语言的绑定库如selenium-webdriver发送HTTP请求。这些请求遵循WebDriver协议被发送到一个浏览器驱动程序如chromedriver,geckodriver。驱动程序负责启动并控制真实的浏览器实例将协议命令翻译成浏览器能理解的操作并返回结果。这种设计的优势是标准化和灵活性。因为协议是标准所以理论上任何支持该协议的浏览器都可以被控制实现了真正的跨浏览器。多语言支持也源于此协议是通用的不同语言只需实现客户端即可。但劣势也同样明显性能开销大每个操作都涉及HTTP请求/响应存在网络延迟。不稳定性由于测试脚本与浏览器运行在不同进程甚至不同机器同步状态变得困难。经典的“元素未找到”错误常常是因为脚本执行速度超过了浏览器渲染/网络请求速度。“黑盒”操作脚本对浏览器内部状态如网络请求、事件循环感知能力很弱难以实现复杂的等待或拦截。实操心得Selenium的稳定性和速度极度依赖于你显式等待WebDriverWait写得是否足够健壮。这要求测试编写者对前端行为有很深的理解增加了学习成本和维护负担。2.2 Playwright浏览器上下文的全能控制者Playwright由微软的团队开发他们也是Puppeteer的原班人马。Playwright没有采用标准的WebDriver协议而是直接通过DevTools协议等浏览器调试协议与浏览器内核通信。它的核心创新在于“浏览器上下文”BrowserContext概念。你可以把它想象成一个完全独立的浏览器会话拥有独立的cookie、localStorage、权限设置但共享同一个浏览器进程。这带来了革命性的优势并行隔离可以轻松创建多个上下文来并行运行测试且互不干扰非常适合现代CI/CD流水线。网络拦截与模拟可以直接在上下文级别拦截、修改或模拟任何网络请求如API响应无需第三方代理工具。自动等待Playwright的大多数操作如click,fill内置了智能等待。它会等待元素可操作可见、稳定、未被遮挡、可点击后才执行大幅减少了“等待”代码。其架构可以理解为对浏览器更深层次的“白盒”控制。它不仅能操作DOM还能录制视频、生成截图、模拟移动设备、处理文件下载、甚至注入脚本修改浏览器环境。2.3 Cypress运行在浏览器内部的颠覆者Cypress的架构最为独特。它将测试运行器直接注入到浏览器中与你的应用程序运行在同一个生命周期和事件循环里。这带来了几个根本性的不同同步访问测试代码可以直接访问window、document等所有前端对象无需序列化/反序列化。执行命令是同步的消除了异步等待的复杂度。实时可观测性Cypress Test Runner提供了一个无与伦比的图形界面可以实时看到命令执行、DOM快照、网络请求、甚至控制台日志调试体验如同Chrome DevTools。网络控制可以轻易地stub存根或spy监听任何XHR或Fetch请求实现快速、稳定的接口模拟。但它的颠覆性也带来了限制浏览器限制主要支持基于Chromium的浏览器Chrome, Edge, Electron和Firefox。对Safari的支持有限。同源限制由于运行在浏览器内它要求被测应用与测试运行器同源。测试多个不同域的页面或进行复杂的跨域操作会比较棘手。编程语言主要使用JavaScript/TypeScript。架构选择映射到应用场景如果你需要测试跨浏览器兼容性尤其是 Safari或使用Java/.NET等后端语言栈Selenium或Playwright是更安全的选择。如果你的团队是前端/全栈为主应用是单页应用SPA追求极致的开发调试体验和测试速度Cypress是神器。如果你需要处理多标签页/多上下文、认证状态隔离、或复杂的网络拦截和性能测试Playwright的架构优势巨大。3. 开发体验与编写效率实战框架好不好用上手写第一个测试用例时的感受最直接。我们从一个简单的登录测试场景来对比。3.1 Selenium显式等待的艺术与折磨用Python Selenium写一个登录测试核心代码充斥着等待逻辑。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver webdriver.Chrome() driver.get(https://example.com/login) # 必须显式等待元素出现 username_input WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, username)) ) username_input.send_keys(testuser) password_input WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, password)) ) password_input.send_keys(password123) # 等待按钮可点击 login_button WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, button[typesubmit])) ) login_button.click() # 等待登录成功后的跳转或元素出现 WebDriverWait(driver, 10).until( EC.url_contains(/dashboard) )问题显而易见代码冗长大量样板化的等待代码。expected_conditions提供的条件有限对于更复杂的条件如等待某个元素特定属性变化、等待多个请求完成需要自定义等待代码可读性会进一步下降。元素定位失败时错误信息通常不够直观需要结合截图和日志排查。3.2 Playwright声明式操作与智能等待用PlaywrightPython版实现同样功能代码简洁得多。from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.launch(headlessFalse) context browser.new_context() page context.new_page() page.goto(https://example.com/login) # 自动等待元素可见并填充 page.locator(#username).fill(testuser) page.locator(#password).fill(password123) page.locator(button[typesubmit]).click() # 自动等待导航完成 page.wait_for_url(**/dashboard) # 或者等待某个代表登录成功的元素出现 # page.locator(.user-avatar).wait_for()关键提升locatorAPI这是Playwright的核心。它不立即返回元素而是返回一个“定位器”对象。当你在定位器上执行操作click,fill,wait_for时Playwright会自动执行一系列检查可见性、稳定性、可操作性等直到条件满足或超时。这几乎消除了显式等待的需要。强大的选择器引擎支持CSS、XPath还有独有的text、has等语义化选择器如page.locator(button:has-text(Sign in))让定位更易读。代码生成器Playwright CLI自带的codegen工具可以录制操作并生成脚本是快速创建用例原型的利器。3.3 Cypress同步语法与实时反馈Cypress的代码风格更接近前端开发者的习惯采用链式调用和Mocha/Chai的断言风格。describe(Login Test, () { it(should log in successfully, () { cy.visit(https://example.com/login); // 命令是异步的但写法是同步的 cy.get(#username).type(testuser); cy.get(#password).type(password123); cy.get(button[typesubmit]).click(); // 断言URL变化 cy.url().should(include, /dashboard); // 断言页面元素 cy.get(.user-avatar).should(be.visible); }); });开发体验的巅峰同步风格虽然所有命令都是异步的但Cypress通过排队机制让你可以用同步的方式书写心智负担小。实时重载保存测试文件后Cypress Test Runner会自动重新运行测试立即看到结果。时间旅行测试运行后可以点击命令日志中的任意一步查看当时的DOM快照、网络请求和console输出调试效率极高。内置断言.should()语法非常直观与Chai断言库深度集成。编写效率总结Selenium需要大量“防御性”编码对工程师经验要求高编写效率最低。Playwright通过智能等待和强大的Locator API大幅减少了样板代码编写效率高且代码结构清晰。Cypress为前端开发者量身定做同步语法和无敌的调试工具带来了最高的开发愉悦感和效率但需要适应其特定的运行模式和限制。4. 执行稳定性、速度与可靠性剖析自动化测试的终极价值是提供可靠的反馈。不稳定Flaky的测试比没有测试更糟糕。4.1 Selenium不稳定的“重灾区”Selenium测试的稳定性很大程度上取决于工程师编写等待逻辑的水平。即使经验丰富的工程师也常遇到以下问题竞态条件脚本执行、网络请求、浏览器渲染、JavaScript执行之间的速度差异导致状态判断错误。动态内容现代前端框架React, Vue, Angular频繁更新DOM元素ID或类名可能是动态生成的。使用固定选择器极易失败。弹窗与通知非预期的浏览器弹窗如地理位置请求、通知权限会阻塞主流程。第三方依赖chromedriver等驱动版本必须与本地安装的浏览器版本严格匹配否则可能出现无法预知的问题。提升Selenium稳定性的技巧使用Page Object Model (POM)将页面元素和操作封装起来减少代码重复便于维护。实现自定义等待条件超越expected_conditions例如等待某个Ajax请求完成通过监听浏览器性能时间线或注入JS标记。重试机制对某些不稳定操作如点击实现带指数退避的重试逻辑。截图与日志在关键步骤和失败时自动截图并记录详细的浏览器日志和驱动日志。即便如此维护一套稳定的Selenium测试套件仍然需要持续投入。4.2 Playwright为稳定性而设计Playwright在架构层面就致力于解决稳定性问题自动等待如前所述这是最大的稳定性提升。它等待的是“可操作性”而不仅仅是“存在性”。网络空闲检测page.goto()和page.wait_for_load_state(networkidle)可以等待页面没有超过500ms的网络连接这对于SPA加载完成是很好的判断。严格模式Strict Modepage.locator(button).click()如果匹配到多个元素默认会抛出错误。这迫使你写出更精确的选择器避免了非预期的操作。丰富的等待事件可以等待特定请求的响应page.wait_for_response、等待事件触发page.wait_for_event(framenavigated)实现精准同步。实战案例测试一个数据表格它在用户点击“查询”后会发起一个API请求然后渲染表格。# Playwright 方式 with page.expect_response(**/api/data) as response_info: page.locator(#query-button).click() response response_info.value # 此时可以断言响应也可以等待表格渲染 page.locator(.data-table tbody tr).first.wait_for()这种方式将测试逻辑与网络请求直接挂钩比盲目等待固定时间或某个元素出现要稳定得多。4.3 Cypress确定性的执行环境Cypress通过控制整个测试生命周期来确保稳定性命令队列所有命令都被推入一个队列Cypress确保上一个命令完全结束后才执行下一个消除了竞态条件。自动重试Cypress的断言.should()和大多数获取元素的命令.get()都会自动重试直到元素满足条件或超时。你几乎不需要自己写重试逻辑。网络存根Stubbing这是Cypress稳定性的“杀手锏”。你可以直接拦截前端发起的API请求并返回预设的模拟数据。// 在测试开始前拦截API cy.intercept(GET, /api/user, { fixture: user.json }).as(getUser); cy.visit(/dashboard); // 等待这个特定的拦截请求完成 cy.wait(getUser); // 此时页面数据已由模拟数据填充不受后端不稳定影响通过存根你将测试与不稳定的后端服务、缓慢的网络环境彻底解耦测试速度极快且100%稳定。速度对比单次执行速度Cypress配合网络存根通常最快因为它运行在浏览器内无进程间通信开销且跳过了真实网络。Playwright次之通信效率高。Selenium最慢。并行执行速度Playwright凭借其“浏览器上下文”的轻量级隔离可以非常高效地在单机上并行运行大量测试远超传统Selenium Grid的方案。Cypress也支持并行但通常需要付费的Dashboard服务或自行搭建复杂的编排。可靠性结论Selenium可靠性建立在工程师高超的“等待艺术”和持续的维护上成本最高。Playwright通过框架层面的智能等待和精准的事件控制提供了开箱即用的高稳定性降低了维护成本。Cypress通过运行环境控制和网络存根提供了近乎确定性的测试环境稳定性最高尤其适合前端单元/集成测试。5. 高级特性与生态扩展能力当你的自动化需求超越简单的点击和断言时框架的高级能力就至关重要。5.1 网络拦截与模拟Selenium原生不支持。需要借助浏览器扩展如BrowserMob Proxy或启动时配置代理配置复杂功能有限。Playwright原生强大支持。可以在路由级别拦截、修改、中止或模拟任何请求包括XHR, Fetch, CSS, Image。# 拦截所有图片请求阻止加载以加速测试 page.route(**/*.{png,jpg,jpeg}, lambda route: route.abort()) # 修改API响应 page.route(**/api/user, lambda route: route.fulfill( status200, content_typeapplication/json, bodyjson.dumps({name: Mock User}) ))这对于测试错误场景、性能极限、或屏蔽第三方跟踪脚本非常有用。Cypress通过cy.intercept()提供强大的网络控制主要用于存根Stub和监听Spy修改响应也很方便。但拦截静态资源如图片不如Playwright直接。5.2 移动端测试与设备模拟Selenium通过Appium基于WebDriver协议可以实现真正的移动端iOS/Android原生或混合应用测试但这是另一个生态复杂度高。Playwright支持原生模拟移动设备视口、User-Agent、触摸事件、地理位置、权限等。它提供了大量预定义的设备描述符如iPhone 13,Pixel 5。iphone playwright.devices[iPhone 13 Pro] context browser.new_context(**iphone) page context.new_page()这虽然不是真机测试但对于响应式布局测试和触摸交互模拟已经足够。对于真机Playwright也有实验性支持。Cypress主要通过cy.viewport()改变视口大小对移动端交互的模拟支持较弱。5.3 文件操作、下载与上传Selenium文件上传通常通过send_keys()传入本地文件路径实现。文件下载需要配置浏览器偏好设置如指定下载目录、禁用下载弹窗然后轮询目录检查文件过程繁琐且不稳定。Playwright处理得极其优雅。上传page.locator(input[typefile]).set_input_files(file_paths)下载可以监听download事件直接获取下载文件的内容、路径和保存。with page.expect_download() as download_info: page.locator(#download-button).click() download download_info.value # 等待下载完成并获取文件路径 path download.path() # 或者直接保存到指定位置 download.save_as(/path/to/save)Cypress上传使用cy.fixture()读取文件内容然后通过cy.get(input[typefile]).selectFile()进行上传。下载处理相对麻烦通常需要启动一个本地静态文件服务器来提供下载链接或者使用cy.readFile()读取已下载到固定目录的文件。5.4 影子DOMShadow DOM支持现代Web组件大量使用Shadow DOM传统选择器无法穿透Shadow边界。Selenium需要执行JavaScript来穿透Shadow Root代码冗长。PlaywrightLocator API原生支持穿透Shadow DOM。使用或/deep/组合子在CSS选择器中即可。# 定位到shadow host内部的元素 page.locator(my-custom-component .internal-button).click()Cypress需要通过.shadow()命令链式调用来穿透。cy.get(my-custom-component) .shadow() .find(.internal-button) .click()5.5 生态与集成Selenium生态最庞大。有成熟的Selenium Grid用于分布式执行与几乎所有CI/CD工具Jenkins, GitLab CI, GitHub Actions无缝集成有大量的云测试平台BrowserStack, SauceLabs支持。报告框架如Allure, ExtentReports选择也多。Playwright生态快速增长。内置了HTML测试报告、追踪查看器Trace Viewer可以回放测试步骤、视频录制。对CI/CD支持良好有官方Docker镜像。云平台支持也在增加。Cypress生态围绕其自身构建。拥有强大的Dashboard服务提供并行、负载均衡、历史记录、失败分析但部分功能收费。插件市场丰富。与CI集成需要处理其“运行在浏览器内”的特性通常需要配合xvfb或使用官方的Docker镜像。6. 常见问题与实战避坑指南在实际项目中迁移或选用新框架总会遇到一些坑。这里记录一些典型问题和解决方案。6.1 从Selenium迁移到Playwright/Cypress的挑战挑战一选择器迁移Selenium测试中可能充斥着脆弱的XPath或复杂的CSS选择器。直接迁移很容易失败。策略利用Playwright的codegen或Cypress的测试运行器重新录制关键用户流生成更健壮的选择器。优先使用># 选择包含“提交”文本的按钮 page.locator(button:has-text(提交)) # 选择包含特定子元素的列表项 page.locator(li:has(.badge))挑战二等待逻辑重构Selenium的显式等待代码需要被移除或替换。策略在Playwright中删除大部分WebDriverWait信任Locator的自动等待。在Cypress中删除自定义的setTimeout或轮询逻辑使用.should()断言和命令的自动重试。注意对于非标准的等待条件如等待一个复杂的JavaScript计算完成Playwright中可以使用page.wait_for_function()Cypress中可以使用cy.window()然后断言。挑战三框架特定的依赖比如Selenium项目可能依赖ActionChains进行复杂鼠标操作或依赖Select类处理下拉框。对应方案Playwright鼠标操作更强大如page.mouse.move(x, y)、page.locator(...).drag_to(target_locator)。下拉框直接用locator.select_option(value)。Cypress使用cy.get(select).select(value)处理下拉框。复杂鼠标操作可通过插件如4tw/cypress-drag-drop或触发原生事件实现。6.2 Playwright实战中的典型问题问题1locator.click()点击不生效这通常是因为元素虽然可见但可能被其他元素如透明遮罩层、浮动提示遮挡或者元素的pointer-events样式被设为none。排查使用page.pause()进入调试模式或运行playwright test --debug。在Trace Viewer中查看操作时的UI快照。解决确保元素在视口中page.locator(...).scroll_into_view_if_needed()。使用force参数慎用locator.click(forceTrue)。这会绕过可操作性检查但可能偏离真实用户行为。检查是否有动态加载的覆盖层可能需要先关闭它们。问题2如何处理新打开的标签页Tab方案监听popup事件。with page.context.expect_page() as new_page_info: page.locator(a[target_blank]).click() # 点击一个打开新标签的链接 new_page new_page_info.value new_page.wait_for_load_state() # 现在可以在new_page上操作了问题3测试在CI如GitHub Actions上失败本地却成功常见原因CI环境无头模式headless下资源加载、动画或字体可能与本地有差异。解决启用追踪在CI配置中设置--trace on保留追踪文件下载后通过Trace Viewer回放分析。增加超时CI环境可能较慢适当增加action_timeout或navigation_timeout。使用更稳定的选择器避免使用与样式或布局强绑定的选择器。6.3 Cypress实战中的典型问题问题1Cypress detected a cross origin error这是Cypress同源策略的限制。当你测试的页面导航到了一个不同域名、协议或端口的地址时Cypress会报错。解决首选使用cy.origin()块Cypress 12.0来访问不同源的页面。cy.visit(/login); // 你的应用 // ... 登录操作跳转到 auth.third-party.com cy.origin(https://auth.third-party.com, () { cy.get(#username).type(user); cy.get(#password).type(pass); cy.get(button).click(); });次选如果可能在测试环境中将被测应用和第三方服务部署在同一个域下。避免不要使用{chromeWebSecurity: false}来完全禁用安全策略这可能导致其他问题。问题2测试中需要登录如何管理认证状态最佳实践不要通过UI重复登录。使用编程方式获取令牌如调用登录API然后将其注入浏览器上下文。// 在支持文件如 cypress/support/e2e.js或 before 钩子中 beforeEach(() { cy.request(POST, /api/login, { username, password }) .its(body.token) .then((token) { // 将token存入localStorage或设置cookie window.localStorage.setItem(authToken, token); }); cy.visit(/dashboard); // 直接访问需要认证的页面 });这比UI登录快几个数量级且更稳定。问题3如何测试window.open或文件下载新窗口Cypress不允许在一个测试中控制多个顶级窗口。替代方案是使用cy.stub()来阻止window.open被实际调用并验证它被以正确的参数调用了。it(opens a new window, () { const stub cy.stub(window, open).as(windowOpen) cy.get(#open-popup-button).click() cy.get(windowOpen).should(be.calledWith, /new-page) })文件下载如前所述通常需要启动一个简单的静态服务器来提供下载链接然后使用cy.readFile()验证。7. 选型决策指南与未来展望经过全方位的对比我们可以得出一个清晰的决策框架。没有绝对的“王”只有最适合你当前场景的“将”。7.1 如何选择一个决策矩阵考量维度SeleniumPlaywrightCypress核心优势标准、跨浏览器、多语言、生态成熟功能全面、稳定、速度快、网络控制强开发体验佳、调试无敌、前端友好、稳定性极高最佳场景1. 需要支持Safari等非Chromium浏览器2. 团队主要使用**Java/C#**等语言3. 已有庞大Selenium资产渐进式迁移1.复杂E2E测试多标签、多上下文、文件操作2.API与UI混合测试强网络拦截需求3. 追求高稳定性和执行速度4. 需要移动端模拟1.前端团队主导的测试2.SPA应用的集成测试3.测试驱动开发TDD4. 对调试体验要求极高应避免场景新项目、对测试稳定性和编写效率要求高项目必须使用Java/C#且无法引入Node.js/Python1. 需要测试多域名工作流2. 必须支持Safari3. 团队排斥JavaScript/TypeScript学习曲线中等需精通等待机制较低API设计现代较低对前端开发者极友好维护成本高需大量稳定化代码低框架处理了大部分稳定性问题低代码简洁自动重试社区/招聘极大资源多人才多快速增长微软背书资源丰富非常活跃前端社区接受度高个人建议对于全新的绿色项目除非有强制的多语言或Safari需求否则不建议从Selenium开始。你是在为未来积累技术债。在前端团队和SPA场景下Cypress是提升开发幸福感和效率的绝佳选择它能紧密融入开发流程。在全栈/复杂E2E场景下Playwright是更全能、更稳健的选择。它的跨浏览器支持包括WebKit for Safari、强大的API和稳定性使其成为现代Web自动化测试的“瑞士军刀”。7.2 未来展望融合与智能化Web自动化测试领域远未定型未来趋势可能在于融合与智能化。AI辅助测试无论是Playwright的Codegen还是Cypress的Studio录制生成测试脚本的能力都在增强。未来结合大语言模型LLM可能实现通过自然语言描述生成或修复测试用例。例如对失败测试的截图或追踪日志AI可以自动分析并建议修复方案。可视化与低代码测试维护的瓶颈在于对代码的依赖。更强大的可视化断言生成、业务流程编排工具可能会降低测试创建的门槛让业务人员也能参与。测试即代码的深化Playwright和Cypress都坚定地走在“测试即代码”的路上这意味着测试将更易于版本控制、代码审查、重构和集成到DevOps流水线中。性能与监控集成Playwright已经可以收集性能指标如LCP, FCP。未来的自动化测试工具可能不仅仅是功能验证器还会成为持续性能监控的探针。回到最初的问题Selenium过时了吗对于维护历史资产和满足特定跨浏览器需求它依然有价值。但对于定义“下一代”的体验和效率标准Selenium确实已经落后。Playwright和Cypress代表了两个不同的进化方向一个向着更强大、更稳定的通用自动化引擎迈进另一个则专注于为前端开发者提供极致的开发体验。我的实战体会是如果你的团队和技术栈允许从这两个中选一个都能让你的Web自动化测试体验迈入一个全新的、更少痛苦的阶段。就我个人而言在需要覆盖多浏览器、处理复杂场景的综合性项目中Playwright目前展现出的全能性和稳健性让它更接近我心目中的“下一代王者”候选。