You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在jsdom测试环境中使用伪类选择器报错的解决方案咨询

jsdom环境下伪类选择器报错的解决方案

针对你遇到的button:hover、:visible等伪类选择器在jsdom测试环境中报错的问题,核心原因是jsdom内置的nwsapi选择器引擎未注册这些非标准/扩展伪类,且直接全局初始化nwsapi会被jsdom覆盖。以下是可行的解决方法:

方法一:扩展jsdom内置的nwsapi实例

在jest的初始化文件(如jest.setup.js)中,获取jsdom创建的nwsapi实例并手动注册所需伪类:

const { JSDOM } = require('jsdom');

// 初始化jsdom并获取其内置的nwsapi实例
const dom = new JSDOM('<!DOCTYPE html>');
const nwsapi = dom.window.document.querySelector.nwsapi;

// 注册:hover伪类(需手动触发元素hover状态才能匹配)
nwsapi.addPseudo(':hover', elem => elem.matches(':hover'));

// 注册:visible伪类(模拟jQuery的可见性判断逻辑)
nwsapi.addPseudo(':visible', elem => {
  const rect = elem.getBoundingClientRect();
  return rect.width > 0 && rect.height > 0 && elem.offsetParent !== null;
});

// 让jQuery使用扩展后的选择器引擎(如果项目用jQuery)
if (typeof window !== 'undefined' && window.jQuery) {
  window.jQuery.find = nwsapi.select;
}

然后在jest.config.js中配置:

module.exports = {
  setupFilesAfterEnv: ['./jest.setup.js'],
  // 其他配置...
};

方法二:直接覆盖jQuery的伪类实现

如果项目依赖jQuery,可以在测试文件顶部直接重写对应的伪类逻辑:

// 重写:visible伪类
jQuery.expr.pseudos.visible = function(elem) {
  const rect = elem.getBoundingClientRect();
  return rect.width > 0 && rect.height > 0 && elem.offsetParent !== null;
};

// 重写:hover伪类(需手动设置元素hover状态)
jQuery.expr.pseudos.hover = function(elem) {
  return elem.classList.contains('hover-mock'); // 测试时给元素加该类模拟hover
};

测试hover场景时,手动给元素添加模拟类:

const button = document.querySelector('button');
button.classList.add('hover-mock');
// 此时$("button:hover")会匹配该元素

方法三:用测试断言替代伪类选择器

如果只是验证元素状态,推荐用测试库的断言方法代替直接使用伪类选择器,比如使用@testing-library/jest-dom:

// 验证元素可见
expect(screen.getByTestId('testing-div')).toBeVisible();

// 模拟hover并验证行为
fireEvent.mouseOver(screen.getByRole('button'));
// 断言hover后的状态变化

注意事项

  • :hover是状态伪类,jsdom不会自动模拟用户交互状态,需通过dispatchEvent或类模拟触发。
  • :visible没有统一标准,需根据项目实际使用的逻辑(如jQuery、自定义规则)来实现伪类判断。

内容的提问来源于stack exchange,提问作者Ninita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:40:23