前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Cypress 踩坑记 - DOM 遮挡

Cypress 踩坑记 - DOM 遮挡

原创
作者头像
嘿嘿不务正业
发布2023-05-16 22:48:28
3840
发布2023-05-16 22:48:28
举报
文章被收录于专栏:嘿嘿的专栏嘿嘿的专栏

Cypress 是一个非常流行的测试工具,然而实际使用过程中发现一些问题,这里做些记录。

问题发现

Cypressclick 是非常常用的指令,然而在一些特殊场景下 click 并不能如想象中那般正常工作。

比如现在有一个弹窗,我们需要测试在点击遮罩层时是否可以正常关闭弹窗。

picture 1
picture 1

测试代码比较简单:

然后执行 Cypress,发现一切如想象中那般简单,很顺利就通过了。

picture 2
picture 2

然而当往 Model 中填充了一些内容后,却发现突然这里就报错了。

picture 3
picture 3

当然,报错是没问题,遮罩层确实被内容遮挡了。问题是刚刚明明也是一样被遮挡,为何就不报错,只是因为内容多了一点就报错,这就很不合适了。

查看文档会发现 click 还支持坐标或位置参数。

picture 4
picture 4

然而,并没有什么用,也就是说这个点击位置无关,应该是和 Cypress 判断元素遮挡有关系,看起来 Cypress 遮挡计算还需要优化。

原因排查

排查源码可以发现 Cypressclick 会经过一些判定:

其中比较重要的参数是 coords.fromElViewport,其数值长这样:

注意其中的 xy,可以认为就是中心点的坐标。

然后 Cypress 会使用该坐标获取该位置最顶层的元素:

可以发现这里直接使用 xy 去获取元素,然后和当前目标元素去做了对比。

这也就是为什么 click 有时候可以点,有时候不可以的原因了,简单说就是中心点被遮了就可以点,没被遮就不可以点,还真是简单粗暴 😂。这也导致了 click 的不稳定现象。

结果验证

那我们来验证下是不是如此,首先我们先创建一个非常小的遮挡元素,然后放在中央位置,测试下是不是会出问题。代码如下:

测试用例就点击 mask 即可。

结果果然不出所料:

picture 1
picture 1

为了严谨,我们再测试下另一个 case,我们将四周全部用元素遮挡住,只留下中心一点,然后点击,验证下是不是可以正常。代码如下:

测试代码无需更改:

不出所料,果然可以点击。

picture 2
picture 2

最后

说实在的 Cypress 这样的遮挡检查方式不太妥当,过于简单粗暴而且很容易让人困惑。理论上而言可以使用 layer 层层比对交叉区域来判定更为妥当。不知道是不是有什么文档导致放弃了。

还有点击的方式感觉也可以再优化一下,比如提供了坐标或者方位,那就应该以提供的坐标或方位来做遮挡判定,现在遇到这种情况只能使用 force,然而使用了 force 这个测试的意义就少了一大半。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题发现
  • 原因排查
  • 结果验证
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档