Selenium 面试考察两点:你能否编写稳定的 UI 测试(等待、定位器、页面对象),以及你能否设计出团队可以长期使用的框架(结构、数据、报告、在 CI 中运行)。不稳定的测试是出现频率最高的话题,因为每个用过 Selenium 的人都和它们斗争过。
以下是 24 道面试题及参考答案。在有助于说明问题时,示例会使用 Java 和 Python 语法,其中的思路适用于任何语言。
基础
1. 什么是 Selenium?它有哪些组件?
Selenium 是一套用于自动化 Web 浏览器的开源工具集。Selenium WebDriver 通过浏览器驱动来控制浏览器,也是大多数人提到 Selenium 时所指的部分。Selenium Grid 可以在多台机器、多种浏览器上并行运行测试。Selenium IDE 是一个录制和回放扩展。Selenium 不处理桌面应用,也不自带测试报告功能,所以你需要把它和测试框架结合起来使用。
2. WebDriver 是如何工作的?
你的测试通过 HTTP 使用 W3C WebDriver 协议,把命令发送给 ChromeDriver 或 GeckoDriver 这样的浏览器驱动,由驱动控制浏览器并返回结果。较新的 Selenium 版本包含 Selenium Manager,它可以找到并下载正确的驱动。
3. Selenium 支持哪些定位器?你更倾向用哪种?
ID、name、class name、tag name、link text、partial link text、CSS selector 和 XPath。优先使用稳定的 ID 或专门的测试属性,比如 data-testid,其次是 CSS。当你必须向上遍历 DOM 树或匹配文本时,再使用 XPath。避免又长又基于位置的路径,比如 /html/body/div[3]/div[2],因为布局一变它们就会失效。
4. findElement 和 findElements 有什么区别?
findElement 返回第一个匹配项,如果没有匹配项就抛出 NoSuchElementException。findElements 返回一个列表,如果没有匹配项就是空列表,所以它适合用来检查某个元素是否不存在。
5. driver.close() 和 driver.quit() 有什么区别?
close() 关闭当前窗口。quit() 关闭所有窗口并结束会话。在 teardown 中使用 quit(),这样就不会残留浏览器进程。
等待与不稳定测试
6. 等待有哪些类型?
| 等待类型 | 工作方式 |
|---|---|
| 隐式等待 | 查找元素时的全局超时时间 |
| 显式等待 | 等待特定元素上的特定条件 |
| 流式等待 | 带自定义轮询间隔和忽略异常列表的显式等待 |
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
优先使用显式等待。混用隐式等待和显式等待可能会导致不可预测的延迟。
7. 为什么不应该使用 Thread.sleep?
它总是等待完整的时间,拖慢测试套件,而且在系统变慢的时候仍然可能不够长。基于条件的等待会在条件满足时立即继续,否则会以清晰的错误信息失败。
8. 不稳定测试的成因是什么?如何修复?
常见成因和修复方法:
- 时序问题:针对确切条件使用显式等待,而不是 sleep。
- 共享数据或残留数据:为每个测试创建测试数据,并在测试后清理。
- 测试之间相互依赖:让每个测试相互独立,可以单独运行。
- 定位器不稳定:添加测试 ID,避免基于位置的路径。
- 动画和遮罩层:等待遮罩层消失,或在测试环境中禁用动画。
- 环境问题:稳定测试环境,并检查网络和第三方调用。
- 并行干扰:按线程隔离状态。
把不稳定的测试隔离出来,避免它阻塞所有人,然后再彻底修复它。不要到处加 retry,因为那会掩盖真正的 bug。
9. 什么是 StaleElementReferenceException?
你找到的元素不再附着在页面上,通常是因为页面重新渲染了。修复方法是在使用前重新定位元素,或者等待新元素出现,而不是长时间持有元素引用。
10. 如何处理不可点击的元素(ElementClickInterceptedException)?
有东西遮住了元素,比如横幅或加载遮罩层。等待遮罩层消失,把元素滚动到可视区域,或者关闭横幅。使用 JavaScript 点击应该是最后手段,因为真实用户无法这样点击,测试会掩盖真正的 bug。
处理页面元素
11. 你如何处理下拉框、弹窗、iframe 和窗口?
- 下拉框:对于标准的 select 元素使用 Select 类,对于自定义下拉框使用基于点击的步骤。
- 弹窗:使用 driver.switchTo().alert() 来接受、关闭或读取内容。
- iframe:使用 switchTo().frame(...) 切入,再用 defaultContent() 切回。
- 窗口和标签页:获取窗口句柄,切换到新窗口,再切回来。
12. 你如何处理文件上传和下载?
上传时,用 sendKeys 把文件路径传给 input type="file" 元素。下载时,在选项中设置浏览器的下载目录,等待文件出现,然后检查文件名和内容。
13. 如何在 Selenium 中执行 JavaScript?
通过 JavascriptExecutor.executeScript,例如用于滚动页面或读取 API 无法获取的值。要克制使用。
14. 什么是无头模式?
浏览器在没有可见窗口的情况下运行,速度更快,适用于服务器和 CI 环境。调试时用有界面模式运行来验证,并检查视口尺寸,因为布局可能不同。
框架设计
15. 什么是页面对象模型?
每个页面或组件都是一个类,持有自己的定位器和操作。测试调用诸如 loginPage.loginAs(user) 这样的方法,不直接接触定位器。当 UI 变化时,你只需修改一个类,而不是大量测试。
class LoginPage:
def __init__(self, driver):
self.driver = driver
def login_as(self, user, password):
self.driver.find_element(By.ID, "user").send_keys(user)
self.driver.find_element(By.ID, "pass").send_keys(password)
self.driver.find_element(By.ID, "submit").click()
16. 一个好的测试框架包含什么?
测试运行器(TestNG、JUnit、pytest)、页面对象、支持不同浏览器的驱动工厂、按环境区分的配置、测试数据管理、等待辅助方法、报告、日志、失败时截图,以及 CI 集成。
17. 你如何管理测试数据?
在测试开始时通过 API 或数据库创建测试所需的数据,而不是通过 UI,并在测试结束后清理。把数据放在文件或构建器中,不要硬编码在测试里,避免测试依赖其他测试遗留的数据。
18. 如何并行运行测试?
使用运行器的并行功能,为每个线程分配独立的驱动(例如用 ThreadLocal),保持测试相互独立,并在 Selenium Grid 或云浏览器服务上运行以跨浏览器扩展。
19. 什么是 Selenium Grid?
一个由 hub 和 node 组成的系统(Grid 4 中是分布式架构),可以在不同浏览器和操作系统上并行运行测试。它缩短了总运行时间,让你覆盖更多浏览器。
策略与场景
20. 哪些应该用 Selenium 自动化,哪些不应该?
自动化稳定、高价值、可重复的流程,比如登录、结账和关键回归路径。不要自动化一次性检查、频繁变化的 UI,或者更适合在底层测试的内容。一个健康的测试套件有大量单元测试和 API 测试,较少的 UI 测试,以及一小组端到端流程。
21. 如何测试带有验证码或双因素登录的应用?
不要在测试中试图破解它们。使用禁用了这些功能的测试环境、带有固定验证码或绕过标志的测试账号,或者用测试 API 来创建会话。
22. 测试在本地通过但在 CI 中失败,你会检查什么?
浏览器和驱动版本、屏幕尺寸和无头模式的差异、较慢机器上的时序、环境数据、网络访问、时区和语言环境,以及并行运行共享数据的问题。失败时捕获截图、页面源码和日志进行对比。
23. 如何在 Selenium、Playwright 和 Cypress 之间做选择?
Selenium 支持多种语言和浏览器,生态庞大。Playwright 和 Cypress 提供内置等待、更简单的配置和良好的调试工具,可能更适合新项目。正确的选择取决于语言、浏览器需求和团队技能。给出你的理由,而不是品牌偏好。
24. 请描述如何自动化一个结账流程。
"我会通过 API 创建用户和商品,然后通过 UI 登录或复用会话。每个步骤一个页面对象:搜索、商品、购物车和支付。我会使用测试支付方式,等待确认元素,通过 UI 和 API 验证订单,并在失败时截图。测试会清理自己的订单,并行运行,并在每次合并时在流水线中执行。"
如何准备
为一个演示网站写一个小型测试套件,包含页面对象、显式等待、失败时截图和 CI 运行。练习解释你如何修复一个不稳定的测试,包括原因和改动。准备好现场编写定位器和等待。练习流程和软技能环节请参阅我们的编程面试助手指南和行为面试指南。
大声说出你的答案,并阅读文字记录,找出含糊的部分,比如"加个等待就行"。在任何现场面试中遵守雇主关于 AI 工具的规定。
使用 YesToTheOffer 练习 Selenium 面试答案
进行模拟技术面试,大声解释你的框架,然后回顾你的记录。30 分钟免费,无需订阅。



