在前端自动化测试中,拖拽操作是一个很常见的场景。虽然 Cypress 是一个非常强大的自动化测试工具,但是它并没有自带拖拽操作,而是需要我们通过代码实现。本篇文章将从实现角度来介绍 Cypress 如何处理拖拽操作。
1. 需求和场景
在实际应用中,拖拽的实现可以被分为两个阶段:
- 模拟拖拽:在这个阶段中,我们需要模拟用户点击某个元素并向另一个元素拖拽。这个阶段只是模拟操作,并不会改变页面上元素的位置或状态。
- 确认拖拽结果:在这个阶段中,我们需要验证拖拽后的元素位置或状态是否符合预期。这个阶段需要检查页面上元素的状态或属性。
场景可以为:拖拽某个元素至页面的某个区域,并检查页面上元素的位置或状态是否符合预期。
2. 模拟拖拽
模拟拖拽的方式分为两种:
- 使用
.trigger("mousedown")
模拟鼠标按下事件,再使用.trigger("mousemove")
模拟鼠标移动事件,最后使用.trigger("mouseup")
模拟鼠标松开事件。这种方式的缺点是需要手动计算鼠标移动的距离和方向。 - 使用
cy.get('your-element').trigger('dragstart')
触发元素的 dragstart 事件,再使用cy.get('your-target-element').trigger('drop')
触发目标元素的 drop 事件。这种方式对于大部分场景都可以解决。
这里举一个 example,使用第二种方式实现一个元素从列表 A 拖到列表 B:
cy.get('#draggable') .trigger('dragstart') cy.get('#droppable') .trigger('drop')
3. 确认拖拽结果
确认拖拽结果需要检查页面上元素的位置或状态是否符合预期,这与具体的场景有关。这里提供几种通用的方法。
3.1 使用坐标检查元素位置
使用 cypress 的 .trigger('mousemove', x, y)
方法模拟鼠标移动,可以通过 cy.get('your-element').should('have.attr', 'style', 'transform: translate(x,y);')
判断元素的位置是否符合预期。
cy.get('#draggable') .trigger('dragstart') cy.get('#droppable') .trigger('mousemove', {clientX: x, clientY: y}) .should('have.attr', 'style', 'transform: translate(' + x + 'px, ' + y + 'px);')
3.2 使用类名检查元素状态
可以通过在 dragstart
事件中添加类名 dragging
,并在 dragover
事件中移除该类,来表示元素被拖拽。可以使用类似 .should('have.class', 'class-name')
的方式判断元素状态是否符合预期。
cy.get('#draggable') .trigger('dragstart') .should('have.class', 'dragging') cy.get('#droppable') .trigger('dragover') .should('not.have.class', 'dragging')
总结
Cypress 很强大,虽然没有自带的拖拽操作,但通过模拟拖拽后再确认拖拽结果,可以实现如此常见的需求,因此让我们的前端测试变得更加方便快捷。
在实现过程中可以根据实际情况使用不同的判断方式,以更好的检查元素的位置或状态,提高测试的效率和准确性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6451ed6d675af4061b5a69a9