如何用Selenium WebDriver构建页面交互卡顿性能测试用例?
嘿,这个需求我太懂了——毕竟DOM元素明明在那儿,但点一下、滚一下半天没反应的卡顿,普通的显式等待根本抓不住。结合你用的Python3+Selenium+Pytest技术栈,我给你几个靠谱的解决方案:
方案1:直接测量交互操作的执行耗时
卡顿本质是交互操作的完成时间超出了正常范围,咱们可以直接记录操作前后的时间差,超过预设阈值就让测试失败。
检测点击响应延迟
import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By def test_click_response_speed(driver): target_btn = driver.find_element(By.CSS_SELECTOR, "your-target-element-selector") # 记录点击前的精确时间 start_time = time.perf_counter() # 用ActionChains模拟真实用户点击,避免直接调用click()的异步问题 ActionChains(driver).click(target_btn).perform() # 记录点击完成后的时间 end_time = time.perf_counter() # 自定义阈值,比如2秒(根据正常环境的基准值调整) assert end_time - start_time < 2, \ f"点击元素响应超时!耗时{end_time - start_time:.2f}秒,超过阈值2秒"
检测滚动响应延迟
def test_scroll_response_speed(driver): start_time = time.perf_counter() # 执行滚动到底部的操作 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面滚动状态稳定 driver.execute_script("return document.readyState") == "complete" end_time = time.perf_counter() # 滚动阈值设为1.5秒,可根据实际情况调整 assert end_time - start_time < 1.5, \ f"页面滚动响应超时!耗时{end_time - start_time:.2f}秒,超过阈值1.5秒"
方案2:利用浏览器性能日志抓长任务
浏览器的性能日志能捕获主线程的长任务(执行时间超过50ms的任务,这是导致卡顿的核心原因),咱们可以通过解析日志来判断是否存在卡顿。
先配置Driver开启性能日志
from selenium import webdriver from selenium.webdriver.chrome.options import Options import json def setup_chrome_driver(): chrome_options = Options() # 开启性能日志采集 chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"}) return webdriver.Chrome(options=chrome_options) # Firefox的配置方式类似 def setup_firefox_driver(): firefox_options = webdriver.FirefoxOptions() firefox_options.set_capability("moz:firefoxOptions", {"prefs": {"devtools.performance.recording.enabled": True}}) return webdriver.Firefox(options=firefox_options)
编写测试用例分析长任务
def test_no_long_tasks_causing_lag(driver): # 先触发容易卡顿的交互:滚动+点击 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") target_element = driver.find_element(By.ID, "your-element-id") target_element.click() # 获取浏览器性能日志 performance_logs = driver.get_log("performance") long_tasks = [] for log in performance_logs: log_msg = json.loads(log["message"])["message"] # 筛选长任务事件 if log_msg["method"] == "Performance.longTaskAdded": # 将耗时转换为毫秒 task_duration_ms = log_msg["params"]["task"]["duration"] / 1000000 if task_duration_ms > 50: long_tasks.append(task_duration_ms) # 如果存在长任务,测试失败 assert len(long_tasks) == 0, \ f"检测到{len(long_tasks)}个卡顿长任务!最长耗时{max(long_tasks):.2f}ms"
方案3:结合Pytest适配扩容场景
既然卡顿只在系统扩容时出现,咱们可以用Pytest的参数化或自定义标记,专门针对扩容场景运行这些性能测试:
import pytest # 参数化不同系统负载场景 @pytest.mark.parametrize("system_load", ["normal", "scaled"]) def test_interaction_performance_under_load(driver, system_load): # 先切换到对应负载环境(比如调用API触发系统扩容) if system_load == "scaled": # 这里写触发扩容的逻辑,比如调用内部接口 pass # 复用前面的耗时检测或长任务检测逻辑 # ...
几个关键注意事项
- 阈值设置要先在正常环境跑几次基准测试,取平均耗时的1.5-2倍作为阈值,避免误判
- 性能测试尽量在隔离的测试环境运行,避免其他进程占用资源影响结果
- 浏览器性能日志的格式可能随版本变化,需要根据实际使用的浏览器版本调整解析逻辑
内容的提问来源于stack exchange,提问作者Ilan Z
相关产品推荐
相关产品推荐

