改变DOM——如何编写一个单元测试来检查脚本是否对页面上的元素进行任何用户可见的更改
Diffing the DOM - how to write a unit test that checks that a script doesn't make any user-visible changes to elements on the page?
我最近一直在写的一个JavaScript插件有各种内置的故障保护,告诉整个插件或部分插件隐藏自己并在无法运行的情况下死亡。例如,假设我们提供的一项功能是,当用户在在线商店中将鼠标悬停在某件商品上方时,自动生成一个弹出窗口,显示竞争对手的价格。然后我们还有一些检查,如果我们不知道任何竞争对手的价格,或者我们不能识别商品,那么就不显示弹出窗口。
我想使用大致遵循以下结构的测试来测试功能禁用:
- 将插件加载到应该禁用某些功能的页面
- 欺骗一些用户操作,否则会触发该功能
-
断言没有对DOM进行任何可见的更改。(即不改变可见元素的样式,不添加或删除元素,除非它们有
display:none
)
步骤#3当然是有趣的一个。是否有一种简单的方法来编写"DOM不变"的JavaScript测试?(或者在Selenium for Python中,这是我用来编写测试的——但是在JavaScript中编写检查可能更广泛,因为它可以在任何JavaScript测试环境中使用。)
注:下面是一些建议,让你远离那些"你做错了!"的人群:
-
是的,我知道我可以用检查特定的更改来代替上面测试中的步骤#3,否则插件将不会做出更改,我甚至可能决定这样做。但是,当这些具体的变化是不规范的,容易改变的时候,这种包罗万象的方法可能是有用的。
-
是的,我也意识到,只是检查没有立即视觉变化的DOM,当一个事件意味着是无效果的触发是严格不足以证明什么都没有坏。不过这对我目前的目的来说是最好的。另外,即使它被证明没有用处,它也很有趣。
使用突变观察器来检测没有发生突变。您可能想签出Mutation Summary,这是一个非常好的用于突变观察者的高级包装器。检查是否发生了突变就像检查返回的数组的长度是否为0一样简单。参见https://code.google.com/p/mutation-summary/。
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 是否有任何可能的原因使我应该指定类型=“”;按钮“;用于我的按钮元素
- 任何一种简单的方法都可以将带有onload的元素作为目标
- 如何查明鼠标按下事件是否发生在滚动条上或元素中的其他任何位置
- 从dom中删除任何元素后,Touchmove事件停止触发
- Javascript集:任何覆盖元素之间比较的方法
- 制作 JavaScript 代码适用于任何元素
- jQuery:append()不是't在选择器中插入任何元素
- 为什么在ASP.NET Ajax更新面板中执行任何操作后javascript元素都停止工作
- 比较数组中的连续元素不会返回任何结果(javascript)
- 如何在呈现页面后使用 Java 脚本检测 dom 元素值的值是否有任何变化(例如,任何输入或复选框值更改)
- 如何在不使用任何 html 输入/搜索元素的情况下读取本地客户端文本文件
- 与任何元素的 .innerHTML 属性匹配的 JavaScript 正则表达式
- 没有任何 DOM 元素的 Aura 组件
- 当“不相关”的 html 选择元素没有选择任何选项时,如何退出 jQuery 事件
- 当我单击chrome的输入类型=搜索元素上的X时,是否触发了任何事件
- IOS自动化:有没有办法;刷新'元素树(或者Instruments'认为可以访问和不能访问的任何内容)
- 如果我只想从数组中打印任何一个元素.任何数组.那么代码会是什么
- 是否可以使用 Javascript 库测试 SVG 元素?任何其他选项