做坏坏的事情时的一些笔记
1. 减少浏览器开销
- 无头模式 (Headless Mode): 如果不需要视觉反馈,可以使用
--headless
浏览器标志,在不显示浏览器的情况下运行测试。 - 阻止不必要的资源: 通过 WebDriver 选项禁用不需要的图像、CSS 或其他元素。
2. 高效的等待机制
避免使用 sleep()
:使用 sleep()
会浪费时间,或者在时机不可预测时导致失败。应该依赖 WebDriverWait
和 预期条件 (Expected Conditions):
- 使用
element_to_be_clickable()
进行click()
或send_keys()
操作。 - 使用
visibility_of_element_located()
进行像get_attribute('innerHTML')
这样的操作。 - 参考 Selenium 文档中的等待。
3. 浏览器特定的优化
- ARM 架构上的 Chrome: 确保你使用的是适用于 M1/M2/M3 ARM 处理器的正确版本的 ChromeDriver。默认版本可能没有经过优化。观看这个指南。
- 清除浏览器历史记录: 在运行测试之前,清除浏览器缓存,以避免由于旧数据导致的潜在性能下降。
- 考虑使用 Firefox: 对于某些网页,测试在 Firefox 上通常比在 Chrome 上运行得更快。
4. 页面加载和渲染策略
- 限制页面加载: 设置
capabilities.pageLoadStrategy
为"eager"
或"none"
,跳过不必要的加载和渲染。对于关键元素,使用WebDriverWait
。 - 缓存管理: 启用浏览器缓存来加快加载速度,使用以下设置:
options.add_argument('--disk-cache-dir=/path/to/cache')
5. 高效的元素定位
- 使用唯一定位符: 优先使用 ID、名称或简单的 CSS 选择器,而不是复杂的 XPath 表达式。
- 检查并更新定位符: 使用浏览器开发者工具找到稳定的属性,并在 UI 发生变化时更新它们。
- 采用页面对象模型 (Page Object Model, POM): 将页面元素和操作封装到可重用的类中,以提高组织性和可维护性。
6. 执行策略
- 并行执行 (Parallel Execution): 使用 Selenium Grid 或基于云的解决方案,分布负载并同时运行多个测试。
- 参数化 (Parameterization): 通过参数化测试输入来加快测试速度,减少冗余。
- 使用 API 而非 UI: 如果可能,使用 API 来进行更快速的数据交互,而不是 UI 自动化。
- 使用 JavaScript 输入: 用 JavaScript 替代
send_keys()
来直接设置值,从而提升性能。
7. 浏览器特定的功能
页面加载策略 (Page Loading Strategy): Selenium 有三种设置:
normal
(默认): 等待整个页面加载完毕。eager
: 等待直到文档可交互,但不完全加载。none
: 不等待,需要手动等待元素。
通过 JavaScript 发送按键:
driver.execute_script("arguments[0].value = arguments[1];", element, value)
8. 最佳实践
- 禁用扩展和后台功能: 使用
--disable-extensions
和--disable-background-networking
等选项。 - 使用 Driver Quit: 始终在脚本结束时调用
driver.quit()
来优雅地释放资源。
Перекладено з: How to Optimize My Selenium for Faster Execution