如何使用 Selenium 逐步进行 Web 测试

最后更新: 19/04/2026
作者: 艾萨克
  • Selenium 允许您跨多个浏览器、语言和操作系统自动执行 Web 功能测试。
  • 使用良好的定位器、显式等待和页面对象模型可以确保测试更加稳定和易于维护。
  • 将 Selenium 与 JUnit、TestNG、Cucumber 和 Selenium Grid 等框架集成,可以更轻松地扩展回归测试并提高兼容性。
  • 使用 Selenium 实现自动化可以大幅缩短测试时间并提高 Web 应用程序的质量。

使用 Selenium 进行自动化 Web 测试

在任何严肃的开发项目中,是否需要进行测试已不再是问题:单元测试、集成测试、功能测试、回归测试、压力测试等等,都是理所当然的。真正起决定性作用的是这些测试的设计方式以及自动化测试工具的选择。如果方法合理,对最终产品的质量及其长期可维护性的影响将是巨大的。

在这个领域,Web应用程序测试已成为关键领域。Selenium正是在此发挥作用,它可能是世界上使用最广泛的Web自动化框架。借助Selenium,您可以模拟浏览器中的几乎任何真实用户交互,并将其转化为可复现、稳定且可在任何环境下执行的测试。

什么是功能性测试?为什么它们如此重要?

当我们谈到功能测试时,指的是旨在回答一个非常具体问题的测试:应用程序是否满足用户的需求和期望?在这种类型的测试中,每个功能都会与其相关的需求进行比较,这些需求通常在软件需求规格说明书(SRS)文档中定义。

核心目标是确保关键业务功能、基本可用性和用户体验与承诺相符。这不仅仅是代码不报错的问题,而是要验证整个用户流程是否流畅、清晰,并且没有出现任何意外情况。

在实践中,功能测试通常侧重于三个方面:首先,验证应用程序的主要功能(用户注册、购买、搜索、预订等);其次,检查最低可接受的导航(用户可以流畅地浏览屏幕);最后,审查影响产品实际使用的可访问性和基本可用性方面。

如果这些测试失败或被省略,问题不仅仅在于技术层面:最终用户满意度会受到影响,进而影响到与产品相关的业务目标。因此,投入时间使用像 Selenium 这样强大的工具来实现这些测试的自动化就显得尤为重要。

系统级功能测试的类型

在侧重于应用程序和 Web 界面整体行为的功能测试中,有三种类型经常反复出现,并且与 Selenium 非常契合。

第一组是冒烟测试。这些是非常基础的测试,每次生成新的系统版本时都会运行,以验证关键用户路径是否正常。它们的目的并非全面覆盖所有功能,而是验证产品至少在不崩溃的情况下是“可测试的”。

其次,我们还有回归测试。它的目的是确认在引入变更(新功能、重构、错误修复、紧急补丁)后,现有行为是否仍然像以前一样正常运行。这些测试耗时更长、工作量更大,而使用 Selenium 进行自动化测试在时间和可靠性方面能够带来巨大的优势。

第三种类型是系统级集成测试。这种测试侧重于验证各个模块(前端、后端、外部服务、支付网关等)是否能够协同工作。每当添加一项影响多个组件的新功能时,确保周边区域不受影响至关重要。Selenium 运行在浏览器层,因此非常适合从用户角度验证这些集成。

Selenium是什么?它是如何发展的?

Selenium 是一个用于自动化 Web 浏览器的开源工具包。它通过一个通用 API,允许您使用各种编程语言(例如 Java、C#、Python、JavaScript、Ruby、PHP 或 Kotlin)编写测试脚本,并在 Chrome、Firefox、Edge、Safari 或其他基于 Chromium 的浏览器以及 Windows、Linux 或 macOS 等操作系统上运行这些脚本。

它的故事始于 2004 年 ThoughtWorks 公司,当时 Jason Huggins 需要一个框架来测试一个内部时间和费用应用程序。最初只是一个内部工具,经过多次迭代,并在 Paul Hammant、Dan Fabulich、Nelson Sproul、Pat Lightbody、Shinya Kasatani 和 Simon Stewart 等人的贡献下,最终发展成为一个完整的生态系统,包括 Selenium IDE、Selenium WebDriver 和 Selenium Grid

这个名字的由来也很有意思:它源于一个笑话,笑话里说汞中毒(当时汞是另一种检测工具)可以通过服用硒补充剂来“治愈”。这个笑话流传了下来,最终成为了该项目的品牌名称。

随着时间的推移,Selenium Remote Control(Selenium RC,也称为 Selenium 1)与 WebDriver(Selenium 2.0)合并,最终被 WebDriver 取代。之后出现了 Selenium 3,它巩固了 W3C 标准。目前的Selenium 4包含了许多非常实用的新功能,例如相对定位器,并针对 Chromium 和 Firefox 浏览器进行了专门的改进。

构成 Selenium 生态系统的工具

当我们谈论 Selenium 时,我们指的不是一个单独的组件,而是一个小型生态系统,其中每个组件都解决了功能性 Web 测试自动化中的特定需求。

  如何轻松地将 PDF 文件拆分成多个文件

硒IDE

Selenium IDE 是一款集成开发环境 (IDE),可通过Firefox 和 Chrome 扩展程序使用。它允许您使用名为 Selanese 的自定义语言来录制、回放、编辑和调试测试,而无需编写代码。Selanese 定义了诸如“点击这里”、“验证此文本”、“填写此字段”等命令。

它对编程或自动化经验较少的初学者尤其有用,可以创建简单的用例或基本测试套件,然后将其导出到各种编程语言的 Selenium WebDriver。它还可以方便地在 Firefox 和 Chrome 上快速测试脚本,或者使用 runScript 触发一小段 JavaScript 代码。

Selenium WebDriver

WebDriver是系统的核心,也是真正用于严肃项目的组件。它是一组API,可以在操作系统级别控制浏览器,与DOM交互,并允许您自动执行用户可能执行的任何操作:浏览、点击、输入、上传文件、读取错误消息等等。

要使用它,请下载特定于浏览器的驱动程序(例如 Chrome/Chromium 的 ChromeDriver),配置其路径,并使用您选择的语言实例化 WebDriver。例如,在 Java 中使用 Chrome:

System.setProperty("webdriver.chrome.driver", "path/to/driver"); WebDriver driver = new ChromeDriver();

之后,您可以使用 `get()` 方法导航到 URL,从浏览器中检索数据(例如标题、当前 URL 或窗口标识符),并定位页面上的元素以与之交互。此外,WebDriver 可以与JUnit、TestNG、Cucumber等库以及Maven等构建工具无缝集成。

硒网格

Selenium Grid解决了可扩展性问题。它是一个服务器,允许你通过一个协调多个远程节点的中央枢纽,在多个浏览器和操作系统上并行运行测试。

该中心节点发送执行请求并将其分发到各个可用节点,从而大幅缩短测试套件的整体执行时间。这在需要进行跨浏览器和跨平台兼容性测试,或者需要快速运行大型回归测试时尤为有用,即使使用 LambdaTest 等云服务提供商提供的云环境也是如此。

Selenium 中的元素定位器:一切的基础

稳定 Selenium 测试的关键之一在于如何定位 DOM 元素。WebDriver 通过 By 类提供了简单和高级的定位机制,各有优缺点。

简单的定位器有By.id()(通过 id 属性)、By.name()(通过 name 属性)、By.tagName()(通过标签名称作为输入)、By.className()(通过 CSS 类)以及专门用于链接的By.linkText()和 By.partialLinkText(),它们使用链接的可见文本。

如果页面结构更复杂,就可以使用诸如`By.cssSelector()`之类的高级定位器,它允许使用非常精确的 CSS 选择器;还可以使用`By.xpath()`,它为导航 HTML 和定位“特殊”元素提供了强大的功能。此外,Selenium 4 还包含相对定位器,它允许您根据元素与其他元素的相对位置来定位元素,其语法与人类语言非常相似。

Java 中相对定位器的典型示例是:`RelativeLocator.with(By.tagName("input")).above(By.id("password"))`,它会查找位于 id 为“password”的字段上方的输入框。当无法对单个元素构建清晰的选择器时,这些策略非常有用。

最佳实践很明确:始终尝试使用唯一、稳定且尽可能可靠的定位器。像`/html/body/div[25]/div[2]/div/span/section[2]/div/h2/p` 这样的绝对 XPath,一旦 HTML 代码发生哪怕最细微的变化,就会失效。基于元素属性或相关文本的相对 XPath 更好,或者更好的选择是使用开发阶段定义的明确 ID 或 data-test-id。

需要具备熟练使用Selenium所需的Web和编程技能

要想充分发挥 Selenium 的效用,仅仅复制粘贴示例是不够的。熟悉HTML 和 CSS会非常有帮助,并且要能够熟练地打开浏览器的元素检查器,了解页面源代码是如何转化为屏幕上显示的内容的。

熟练使用浏览器开发工具(例如 Chrome DevTools、Firefox DevTools 等)以及 XPath 和 CSS 选择器等概念也至关重要。您将花费大量时间检查元素、测试定位器,并找出能够唯一标识您想要自动化操作的内容的元素。

在编程方面,如果你的目标是从事测试自动化工程,那么你必须接受编写代码是工作的一部分。好消息是,使用 Selenium 编写的代码简洁明了,并且高度专注于特定操作(导航、定位、点击、验证)。如果你有函数式编程的背景,Selenium 是一个很好的入门选择。

根据你选择的编程语言(Java、Python、C#、JavaScript 等),你还需要学习该生态系统的参考测试框架:例如,Java 中的 JUnit 或 TestNG,Python 中的 pytest 或 unittest,C# 中的 NUnit,或者 JavaScript 中的 Jest/Mocha。这些框架为测试用例、断言以及与外部工具的集成提供了结构。

逐步配置您的 Selenium 环境

在 Java 项目中,一种相当常见的架构是使用Maven 项目,并依赖 Selenium WebDriver、JUnit 5(或 TestNG),如果使用 BDD,则还需要依赖 Cucumber。Maven 会处理所有依赖项的解析和集成,从而简化构建、测试和部署流程。

除了库文件之外,您还需要下载目标浏览器的 WebDriver。例如,对于 Chrome 浏览器,您需要下载 ChromeDriver,并且该驱动程序必须对系统可见(例如,将其添加到 PATH 环境变量中,或使用 `System.setProperty` 指定其路径)。完成这些步骤后,您可以实例化该驱动程序,然后直接从代码启动浏览器。

  Pogocache 软件缓存是什么以及它用于什么?

创建驱动程序后,第一个典型的命令是导航到页面:driver.get("https://rahulshettyacademy.com/seleniumPractise/#/");。从那里,您可以从浏览器请求信息(标题、当前 URL、窗口标识符),或者开始使用 By 定位元素并与之交互。

为了确保测试顺利结束,请务必记住在测试结束时调用 ` driver.close()`或 `driver.quit()`,以释放会话和相关的浏览器资源。

隐式等待、显式等待和 AJAX

初学者常犯的错误之一是运行 Selenium 脚本的速度“过快”,试图与尚未创建或渲染的元素进行交互。这时你会看到类似“找不到元素”的错误信息,或者某些交互操作手动执行时总是有效,但自动化执行时却会间歇性失败。

最初人们往往会倾向于使用`Thread.sleep()`并在测试中插入固定的暂停时间,但这是一种糟糕的做法,会导致测试变得脆弱且速度缓慢。Selenium 提供了隐式和显式等待机制,以便与应用程序保持同步。

WebDriver 可以配置隐式等待,告诉它在放弃查找某个元素之前要尝试查找多长时间。例如,在 Java 中:` driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500)); `。这是一种快速但粒度不够细的解决方案。

另一方面,显式等待允许您等待元素满足特定条件:例如可见、可点击、存在于 DOM 中等等。例如,在 Java 中,您可以编写如下代码:`WebElement orderBtn = new WebDriverWait(driver, Duration.ofSeconds(2)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//button[contains(text(),'Place Order')]"))) ;`

在大量使用 AJAX 和 jQuery 等库的现代应用程序中,有时需要更进一步,检查异步调用的状态。Selenium WebDriver 允许你在页面上下文中执行任意 JavaScript 代码,例如,它可以运行一个脚本来检查 jQuery 是否已完成所有请求,只有在完成所有请求后才继续测试,从而实现更强大的“智能等待”策略。

从独立脚本到专业框架:页面对象模型和行为驱动开发

最初,通常会将所有测试代码放在一个方法中:浏览器打开、导航、定位器、操作、断言……这对于演示来说没问题,但一旦你想维护几十个或几百个测试用例,它就会变成一场噩梦。

解决这种混乱局面的办法是页面对象模型(POM)模式。其理念简单而强大:将测试逻辑(你想检查的内容)与每个页面的交互逻辑(技术实现方式)分离。为此,需要为应用程序的每个页面创建一个类(例如登录页面、着陆页、结账页面等)。

每个页面对象都存储了相关元素的选择器,并包含代表用户操作的高级方法:登录(用户名,密码)、搜索项(名称)、添加到购物车()、结账项() 等。您的测试不是包含 XPath 和硬 CSS,而是调用这些方法,从而使代码更易读、更易维护。

如果页面设计发生变更,通常只需调整相应页面对象中的定位器即可。在大型回归测试套件中,这可以显著节省维护时间。此外,POM 可以与页面工厂模式结合使用,进一步简化元素定义。

在采用敏捷方法和行为驱动开发 (BDD) 的环境中,将Selenium 与 Cucumber集成非常普遍。Cucumber 允许您使用 Gherkin(一种非常接近自然语言的语言)描述业务场景,然后将每一行(“Given”、“When”、“Then”)链接到 Java 方法或所选语言的方法,这些方法被称为步骤定义。

这些步骤定义不应直接包含 Selenium 逻辑,而应依赖于页面对象。因此,类似“当用户使用短名称 <名称> 进行搜索并提取产品实际名称时”这样的步骤,将调用着陆页的方法来搜索并获取产品名称,并将选择器封装在该类中。

与测试框架集成及实际示例

一种常用的模式是将 Selenium WebDriver 与Java 中的JUnit 5结合使用。每个使用 @Test 注解的方法都可以打开浏览器,执行特定的用户流程,然后使用断言来验证预期结果。

例如,在购买测试中,您可以:导航到页面,搜索“Broco”,使用“+”按钮增加数量,读取数量输入值并验证其是否为 2,并进一步验证页面标题是否与预期匹配。所有这些操作都由 JUnit 协调,WebDriver 在后台执行。

除了 JUnit 之外,许多团队也更倾向于使用TestNG,因为它具备高级的测试分组、依赖管理和并行执行功能。对于可视化报告,ExtentReports 或 Allure等解决方案可以生成包含屏幕截图、执行历史记录和指标的详细报告,从而帮助进行故障分析。

将 Selenium 与 Cucumber 结合使用具有诸多优势:使用 Gherkin 清晰描述场景、明确区分业务步骤和技术逻辑,以及更易于维护的测试代码结构。所有这些都能无缝集成到 Maven/Gradle 环境和 CI/CD 流水线中。

变更管理和稳定自动化

Web自动化面临的最大挑战之一是用户界面会随着时间推移而发生巨大变化。作为自动化工程师,您将不得不处理并非由实际错误引起的误报,而是由应用程序或基础架构的变更导致的错误。

  如何逐步在 Windows 11 电脑之间迁移电子邮件和数据

常见问题可分为四类:测试本身的错误(自动化测试缺陷)、环境故障(服务器宕机、数据不一致)、导致选择器失效的无害 UI 变更,以及真正意义上的缺陷。区分这些问题是日常工作的一部分。

为了最大限度地减少变更的影响,关键在于使用强大的本地化策略(稳定的 ID、经过数据测试的属性、精心设计的相对 XPath)和模式,例如页面对象模型,将选择器集中在代码的几个点中。

等待模式也会影响稳定性:过于激进或配置不当的设置会导致性能不稳定。精心设计的显式等待或针对 AJAX 的智能等待等策略有助于减少误报,并使测试更能应对延迟峰值或加载时间的微小波动。

该生态系统也开始涌现出一些与 Selenium 集成的工具,这些工具能够提供自愈测试功能和智能选择。一些商业解决方案应用启发式算法和人工智能来检测故障是源于定位器损坏还是真正的问题,并能动态地推荐新的定位器,甚至允许仅运行受特定代码更改影响的测试,从而缩短反馈周期。

可以使用 Selenium 实现哪些类型的测试自动化?何时使用 Selenium 进行自动化测试才划算?

Selenium 在以下四个方面表现尤为出色:功能性 UI 测试、回归测试、兼容性测试和端到端测试。所有这些测试的目标都是模拟真实用户在 Web 应用程序中的操作流程。

在功能方面,Selenium 可以远程控制浏览器,定位界面元素(输入框、按钮、下拉菜单、链接),并模拟填写字段、选择选项、点击和验证消息等操作。它非常适合用户注册、登录、结账流程、搜索或任何关键业务工作流程等应用场景。

回归测试是自动化带来最大回报的地方:无需每次有新版本时都手动重复相同的工作流程,只需启动 Selenium 套件即可快速验证是否引入了任何不必要的副作用。

在兼容性方面,Selenium 支持多种浏览器和操作系统,确保应用程序在各种浏览器、系统和分辨率组合下都能良好运行。在端到端测试中,可以将从产品搜索到支付和最终确认的完整工作流程串联起来。

用户注册就是一个典型的自动化场景:访问注册 URL,输入无效数据以验证验证机制是否有效,检查错误信息,输入有效数据,确认注册,并验证是否显示了自定义欢迎页面。手动在所有浏览器和系统组合上执行此操作可能需要数天时间;而使用 Selenium,一旦构建完成,即可根据需要多次运行。

Selenium 的优势、局限性和现代替代方案

Selenium 的主要优势在于其多功能性和集成能力。它是免费的,无需许可证,支持多种语言、浏览器和平台,并且能够与各种第三方框架和工具良好兼容。它允许在不同环境中重用测试代码,并拥有一个庞大且非常活跃的社区。

此外,借助 Selenium Grid,您可以并行运行测试,从而缩短回归测试时间,并使用 Jenkins、GitLab CI 或 GitHub Actions 等工具完全自定义持续集成报告和工作流。

缺点之一是,Selenium 本身并不支持原生桌面或移动应用程序,需要像 Appium 这样的额外解决方案。此外,它默认不包含高级报告引擎:需要与其他库集成才能生成完善的报告。而且,它对编程知识有一定的要求,这对于纯粹的手动测试人员来说可能是一个障碍。

近年来,Cypress、Playwright 和 Katalon等替代方案相继涌现。Cypress 因其易于上手、学习曲线平缓,在现代 Web 应用开发中广受欢迎,但它主要在浏览器环境下运行,缺乏 Selenium 那样的跨浏览器兼容性。微软的 Playwright 提供现代化的 API 和强大的多浏览器支持,稳定性也十分出色。而 Katalon 则在各种自动化引擎的基础上,提供了更加用户友好的界面和可视化工具。

即便如此,对于需要高度灵活性、支持多种语言、与各种基础设施集成以及大规模并行执行的复杂业务项目而言,Selenium 仍然是一个非常可靠的选择,很难完全被取代。

总而言之,掌握 Selenium 可以让您自动化从最基本的工作流程到大型回归测试套件的一切操作,将它们集成到 CI/CD 管道中,并显著提高任何 Web 应用程序的质量水平,同时缩短测试和发布时间,并将 QA 团队从繁琐的工作中解放出来,从事更高价值的任务。