Cypress之模拟键盘鼠标操作以及页面元素拖动操作

上篇文章讲解了使用cypress框架时,如何上传或者下载文件,以及定位操作iframe和shadow dom下的页面元素。此次课程将讲解如何模拟键盘输入、鼠标操作以及如何拖动页面元素,另外,会介绍如何点击隐藏的页面元素,为了完成此次课程目标拆分了3个task。

  • 模拟键盘输入和鼠标操作
  • 拖动页面元素
  • 处理隐藏的页面元素

接下来就从第一个task开始。

模拟键盘输入和鼠标操作

使用cypress框架,如果要模拟键盘输入很简单,调用cy.type({键盘值})即可。下面脚本模拟了输入enter、shift等键盘值,Cypress支持的可输入的键盘值可查看“ type | Cypress Documentation ”。同样,Test Runner上选择“keyboard_spec.js”即可运行下面的脚本。

describe("type key with keyboard",()=> {
    it("should input key successfully",()=> {
        cy.visit('https://devexpress.github.io/testcafe/example/');
        cy.get('#developer-name').type('{rightarrow}');
        cy.get('#developer-name').type('{leftarrow}');
        cy.get('#developer-name').type('{enter}');
        cy.get('#developer-name').type('{alt}');
        //如果要模拟键盘输入,调用type({key}),注意,cypress不支持输入tab键

        cy.get('#developer-name').type('{shift}{alt}Q');
        //模拟输入组合键

        cy.get('#developer-name').type('{ctrl}test');
        //模拟输入ctrl+test字符串
        
        cy.get('#developer-name').clear()
        cy.get('#developer-name').type('{ctrl}test').type('everything');
        //模拟输入键盘值后再向输入框输入字符串“everything”

        cy.get('#developer-name').type('{shift}',{delay:1,force:true,timeout:5})
       //type()中除支持输入键值外,还支持传递其他参数,例如delay:延迟1秒进行键值输入操作,force设置为true表示不会进行actionbility检查等 
    })
});

上面演示了如何模拟键盘输入,接着再看看如何模拟鼠标操作。实际前面讲过的click()就属于点击鼠标左键操作,这里主要介绍如何模拟点击鼠标右键、双击、拖动等操作。同样,Test Runner中选择“mouse_spec.js”即可运行下面的脚本。

describe("mouse action demo",()=> {
    it("should control mouse successfully",()=> {
        cy.visit('https://devexpress.github.io/testcafe/example/');
        cy.get('#developer-name').dblclick();
        //模拟双击鼠标左键操作

        cy.get('#developer-name').rightclick();
        //模拟点击鼠标右键,注意cypress封装的鼠标右键操作,不会显示右键菜单项

        cy.get('#developer-name').trigger('mousedown');
        cy.wait(1000);
        cy.get('#developer-name').trigger('mouseleave');
        //模拟长时间点击鼠标

        cy.get('#developer-name').trigger('mouseover');
        //模拟鼠标划过某个页面元素

        cy.get('#developer-name')
            .trigger('mousedown', { which: 1})
            .trigger('mousemove', { which: 1, pageX: 600, pageY: 600 })
            .trigger('mouseup')
    })
    //模拟鼠标拖动,通过调用trigger('mousedown').trigger('mousemove').trigger('mouseup')实现拖动操作
    //另外需要注意,因为cypress底层是调用jquery提供的实现鼠标拖动方法,如果要模拟拖动操作,那么mousedown()和mousemove()中要带参数{which:1}
});

上面讲解了如何模拟键盘和鼠标操作,接下来看看如何实现拖动页面元素。

拖动页面元素

实际拖动页面元素的过程就是点击鼠标后进行拖动的过程,为了实现页面元素拖动,调用trigger(mouseEvent)即可完成。另外,脚本中还需传递鼠标点击的原始位置、拖动的目标位置的X,Y坐标。下面脚本通过调用cy.get(targetElementSelector).getBoundingClientRect()获取目标元素的坐标信息,完成拖动操作。同样,Test Runner中选择“dragElement_spec.js”即可运行下面的脚本。

describe('drag element demo', () => {
    it('should drag element successfully', () => {
        cy.visit('https://devexpress.github.io/testcafe/example/');
        //打开被测应用

        cy.get('#tried-test-cafe').click();
        //点击页面按钮,下面的可读条才允许拖动

        moveToTargetElement()
        //调用封装好的拖动元素方法完成拖动操作
    });

   //如果要获取某个元素的坐标信息,需要调用cy.get(selector).then($el=>{$e1[0].getBoundingClientRect()})
    function moveToTargetElement() {
        cy.get('.slider-value:nth-child(2)')
        //定位需要拖动的目标位置元素

            .then($el => {
                const {top, left, bottom, right} = $el[0].getBoundingClientRect();
                //获取目标位置元素的坐标信息

                let targetX = (left + right) / 2;
                let targetY = (top + bottom) / 2;
                //计算拖动的目标位置X坐标和Y坐标值

                console.log(targetX);
                console.log(targetY);
                //打印坐标信息,方便调试

                cy.get('.slider-container #slider span')
                //定位拖动的起始位置元素

                    .trigger('mousedown', {which: 1})
                //在起始位置模拟鼠标点击操作

                    .trigger('mousemove', {
                        which: 1,
                        pageX: targetX,
                        pageY: targetY
                    })
                //模拟鼠标拖动操作,并传递了拖动的目标位置信息

                    .trigger('mouseup', {force: true});
                //拖动完成后,模拟释放鼠标操作    
            })
    }
});

拖动页面元素是一个通用的操作,接下来把上面的拖动脚本封装成cypress的用户自定义命令,这样当测试脚本中需要拖动页面元素时,调用此命令即可。下面是command.js中封装的命令。可以看到,调用该命令时需传入定位起始位置元素selector和目标位置元素selector即可。

Cypress.Commands.add('dragElement',(sourceElementSelector,targetElementSelector)=> {
    //通过参数的方式传入开始位置元素和目标位置元素selector,便于方法复用。

    cy.get(targetElementSelector)
        .then($el => {
            const {top, left, bottom, right} = $el[0].getBoundingClientRect();
            let targetX = (left + right) / 2;
            let targetY = (top + bottom) / 2;
            console.log(targetX);
            console.log(targetY);
            cy.get(sourceElementSelector)
                .trigger('mousedown', {which: 1})
                .trigger('mousemove', {
                    which: 1,
                    pageX: targetX,
                    pageY: targetY
                })
                .trigger('mouseup', {force: true});
        })
});

修改测试脚本,改为调用封装的自定义命令cy.dargElement(sourceSelector,targetSelector)完成拖动操作。同样,Test Runner中选择“dragElementWithCommand_spec.js”即可运行下面的脚本。

describe('drag element demo', () => {
    it('should drag element successfully', () => {
        cy.visit('https://devexpress.github.io/testcafe/example/');
        cy.get('#tried-test-cafe').click();
        cy.dragElement('.slider-container #slider span','.slider-value:nth-child(3)')
        //调用封装的自定义命令实现拖动操作,这里传入的参数时开始位置元素的selector和目标位置元素的selector。
    });
})

运行上面的脚本,结果如下所示,可以看到刻度尺上的小方块被拖动到了3的位置,与目标位置元素“.slider-value:nth-child(3)”一致。

处理隐藏的页面元素

如果测试场景中期望点击隐藏的页面元素,或者获取隐藏的页面元素属性值、innerText等,可以通过给click传入可选参数或者调用invoke('show')的方式完成。具体脚本如下所示,同样,Test Runner上选择“clickHidenElement_spec.js”即可运行下面的脚本。

describe("control hidden element demo",()=> {
    it("should click hidden element successfully", () => {
        cy.visit("https://www.jquery-az.com/css/demo.php?ex=123.0_4#");
        cy.get('p a').contains('Hide Menu').click();
        //点击页面的“Hide Menu”后,上面的菜单会被隐藏起来

        cy.get('li a').contains('Home').click({force:true});
        //click()方法中传递{force:true}参数时,不会校验页面元素是否达到可点击条件,也会对该元素执行点击操作,通过此方法可以点击被隐藏的页面元素。

        cy.get('li a').contains('Contact').invoke('show').click();
        //调用invoke('show')后再点击需要被点击的页面元素

        cy.get('li a').contains('Contact').click();
        //此点击操作未进行任何处理,当运行到此步骤时,脚本会失败,并提示“因为页面元素不可见,不允许被点击”
    })
});

 执行结果如下所示,可以看到,执行到最后一步时,运行失败,并给出了详细的错误信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taoli-qiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值