Як оптимізувати мій Selenium для швидшого виконання

做坏坏的事情时的一些笔记

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

Leave a Reply

Your email address will not be published. Required fields are marked *