首页 > 其他分享 >Cypress 踩坑记 - DOM 遮挡

Cypress 踩坑记 - DOM 遮挡

时间:2023-05-16 22:56:58浏览次数:26  
标签:坑记 DOM Cypress fromElViewport cy Covered elAtCoords click

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

问题发现

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

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

picture 1

测试代码比较简单:

/// <reference types="cypress" />

context('Actions', () => {
    beforeEach(() => {
        cy.visit('http://localhost:3300/Modal');
    });

    it('Override', () => {
        cy.get('.mantine-Button-root').click();
        cy.get('.mantine-Modal-root').should('exist');
        cy.get('.mantine-Modal-overlay').click();
    });
});

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

picture 2

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

picture 3

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

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

picture 4

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

原因排查

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

if (force !== true) {
    // now that we know our element isn't animating its time
    // to figure out if it's being covered by another element.
    // this calculation is relative from the viewport so we
    // only care about fromElViewport coords
    $elAtCoords =
        options.ensure.notCovered && ensureElIsNotCovered(cy, win, $el, coords.fromElViewport, options, _log, onScroll);
    Cypress.ensure.isNotHiddenByAncestors($el, name, _log);
}

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

{
    "top": 0,
    "left": 0,
    "right": 1000,
    "bottom": 660,
    "topCenter": 330,
    "leftCenter": 500,
    "x": 500,
    "y": 330
}

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

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

const getElementAtPointFromViewport = function (fromElViewport) {
    // get the element at point from the viewport based
    // on the desired x/y normalized coordinations
    let elAtCoords;

    elAtCoords = $dom.getElementAtPointFromViewport(win.document, fromElViewport.x, fromElViewport.y);

    if (elAtCoords) {
        $elAtCoords = $dom.wrap(elAtCoords);

        return $elAtCoords;
    }

    return null;
};

const ensureDescendents = function (fromElViewport) {
    // figure out the deepest element we are about to interact
    // with at these coordinates
    $elAtCoords = getElementAtPointFromViewport(fromElViewport);
    debug('elAtCoords', $elAtCoords);
    debug('el has pointer-events none?');
    ensureElDoesNotHaveCSS($el, 'pointer-events', 'none', name, log);
    debug('is descendent of elAtCoords?');
    ensureIsDescendent($el, $elAtCoords, name, log);

    return $elAtCoords;
};

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

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

标签:坑记,DOM,Cypress,fromElViewport,cy,Covered,elAtCoords,click
From: https://www.cnblogs.com/zxbing0066/p/17407127.html

相关文章

  • Rocky 9 Linux 平台 vim 9.0 源码包编译安装踩坑记录
    目录vim9.0部署准备环境vim9.0源码包正式部署vim9.0初体验plug-vim安装插件在上一篇《vim入门实战》篇,我并没有介绍Linux平台源码包形式安装以及基础运用。本篇教程,以源码包形式部署vim9.0,演示RockyLinux9平台安装vim9.0.1523,目前最新版为vim9.0.15xx。如......
  • 王者荣耀吕布技能解析--- aggrandizement ,lunette ,lunette ,domian
    简单好用又强大的上单,稳定可靠被动饕餮血统,附魔强化后攻击补血---aggrandizement 强化前缀ab,ac,ad,af,ag,al,an,ap,ar,as,at-来自拉丁介词ad,表示“朝、向、去,或弱化为强调”。在字母b,f,g,l,n,p,r,s,t前同化为ab-,af-,ag-,al-,an-,ap-,ar-,as-,at-;在c......
  • 常用模块,time,random,json,os
    模块底层都是c语言写的模块的分类内置模块,不需要自己安装,直接拿过来用扩展模块,第三方模块,需要自己安装本地编辑器安装小白教程(forchange.cn)random随机数.random()不入参,求(0,1)之间的随机数,开区间.randint(a,b)求随机整数,闭区间[a,b].randrange(start,stop,step......
  • KVM环境:Active console session exists for this domain
    做测试过程中被迫换电脑,但没有关掉原电脑的连接,所以用其他电脑连接测试环境时,发现之前的kvm测试环境因没有断开,无法连接:error:operationfailed:Activeconsolesessionexistsforthisdomain[root@bogon~]#virshconsoledb11gConnectedtodomaindb11gEscapecharact......
  • vue dom拖拽指令
    还可以封装一下代码,不想封了,移动端pc端区别:事件不同,pc端鼠标事件移动端触摸事件;pc端直接获取e.pageX,移动端e.changedTouches[0].pageX使用直接在dom绑定v-dragdirectives:{drag(el,bindings,vnode){letphone=falseletmax=max||0if(wi......
  • 瑞吉外卖项目踩的几个小坑记录
    1.不知道前端发送过来的请求是以json格式还是以普通数据格式发送。这方面是用浏览器的调试工具查看,找到network选项卡,然后点击playload选项卡查看,如下图 如果数据是一行一行显示的,则是普通格式;如果是以{}括号引用起来的,则是JSON格式。2.在开发功能时,将菜品对应的名字起为:......
  • python基础学习-random
    参考地址:Python-Core-50-Courses/第20课:Python标准库初探.mdatmaster·jackfrued/Python-Core-50-Courses(github.com)待补充......random-随机数和随机抽样模块生成随机数、实现随机乱序和随机抽样,下面是常用函数的列表。getrandbits(k):返回具有k个随机比特位的整数......
  • js基础---js操作dom元素节点的方法
    replaceWith():使用括号内元素替换当前元素remove():删除当前元素解决点击a标签不跳转页面的方法......
  • python -- numpy.random.seed()
     在使用numpy时,有时需要用到随机数,并且想让生成的随机数在每次运行时都能得到相同的数组,这时可以使用random.seed(inti)函数,设置随机数种子。 下面用几个测试demo,感受下效果~(1)测试demo1importpandasaspdimportnumpyasnpnp.random.seed(0)sample=pd.DataFra......
  • MySQL的随机排序(random orderby)
    MySQL的随机排序(randomorderby)是指在查询数据库时,将结果集以随机的方式排列。这种排序方式可以用于有趣的应用场景,例如实现随机音乐播放、广告推荐等。要实现MySQL的随机排序,可以使用RAND()函数。RAND()函数可以生成0-1之间的随机数,将它作为排序的依据即可。SELECT*FROM`my......