You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cypress中测试react full calendar历史元素不可拖拽

测试实现方案

针对react full calendar的历史日程不可拖拽校验,有两种常用的实现方式,你可以根据自己的项目配置选合适的:

方案1:属性直接校验(执行效率最高)

react full calendar对不可编辑的日程项默认会添加fc-event-non-draggable专属类,同时会把元素原生draggable属性设置为false,直接断言这两个特征即可完成校验,补充后的代码如下:

it("should not be draggable(editable)", () => {
    // visit /schedule
    cy.visit("/schedule").waitForGraphQL();

    // Click prev button
    cy.get(controls.week.prevButton()).click().waitForGraphQL();

    // 定位历史日期对应的.item日程元素,校验不可拖拽特征
    cy.get(".item")
      .should("have.class", "fc-event-non-draggable")
      .and("have.attr", "draggable", "false");
});

如果你的项目自定义了full calendar的类名配置,找不到默认的fc-event-non-draggable类,也可以单独校验draggable属性:

cy.get(".item").should($el => {
  expect($el.attr("draggable")).to.not.equal("true")
})

方案2:模拟拖拽操作校验(最贴合真实用户场景,结果最准确)

如果属性校验不能覆盖你的自定义场景,可以直接模拟用户拖拽操作,验证元素拖拽后位置没有发生变化,不需要额外装插件也可以实现:

it("should not be draggable(editable)", () => {
    // visit /schedule
    cy.visit("/schedule").waitForGraphQL();

    // Click prev button
    cy.get(controls.week.prevButton()).click().waitForGraphQL();

    // 记录日程元素初始位置
    cy.get(".item").then($el => {
      const initPosition = $el[0].getBoundingClientRect()

      // 模拟完整拖拽流程,坐标可根据你的页面布局调整到目标日期单元格位置
      cy.get(".item")
        .trigger('mousedown', { which: 1 })
        .trigger('mousemove', { clientX: 500, clientY: 200 })
        .trigger('mouseup', { force: true })

      // 断言拖拽完成后元素位置无变化
      cy.get(".item").then($updatedEl => {
        const currentPosition = $updatedEl[0].getBoundingClientRect()
        expect(currentPosition.left).to.eq(initPosition.left)
        expect(currentPosition.top).to.eq(initPosition.top)
      })
    })
});

两种方案也可以组合使用,进一步提升测试结果的可靠性。

内容的提问来源于stack exchange,提问作者Akash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:54:04