【问题标题】:drag and drop not work in cypress but working by user拖放在柏树中不起作用,但由用户使用
【发布时间】:2021-04-25 12:55:28
【问题描述】:

@craftjs/core 在我的项目中使用。 当用户拖放工具以添加到画布时,一切正常(在画布中创建的组件) 但在 cypress 中放置后未发生(组件未在画布中创建)。

在工具箱组件中: ...

const { connectors } = useEditor();
     const dragStart = (e) => {
        e.dataTransfer.setData('text/html', e.parentNode);
        setExpanded(false);
    };

...

    <Accordion expanded={expanded} onChange={() => setExpanded(!expanded)}>
            <AccordionSummary
              expandIcon={<i className="fal fa-chevron-down" />}
              aria-controls="toolbox-content"
              id="ToolBoxPanel"
            >
              <small>ToolBox</small>
            </AccordionSummary>
            <AccordionDetails className="justify-content-center p-0">
<MaterialButton
              aria-label="text"
              onDragStart={dragStart}
              variant="text"
              color="secondary"
              className="my-1 p-1 toolsButton mx-1"
            >
              <i
                className="fal fa-font "
                ref={(ref) => {
                  connectors.create(ref, <Text text="Type anything" />);
                }}
              />
            </MaterialButton>

。 . .

在 cypress/integration/spec.js 中

describe("Drag and Drop", () => {
  beforeEach(() => {
    cy.visit('/');
    cy.waitForReact();

  })
  
  it('should add text componnent to canvas', () => {
   
    cy.contains('ToolBox').click().wait(500)

    cy.get('#body').then($editor=>{
      cy.get('.toolsButton[aria-label="text"] i').realHover().trigger('mousedown').reactDnd($editor,{offsetX:300,offsetX:300});
  
      cy.wait(5000);
    })
  
  })
});

在 cypress/support/commands.js 中

Cypress.Commands.add('reactDnd', {
    prevSubject: 'element',
  }, (sourceSelector, targetSelector, options) => {
    const dataTransfer = new DataTransfer;
    const opts = {
      offsetX: 100,
      offsetY: 100,
      ...(options || {})
    };
    cy.wrap(sourceSelector.get(0))
      .trigger('dragstart', {
        dataTransfer,
      }).wait(1000);
    cy.get(targetSelector).then($el => {
      const {
        x,
        y,
      } = $el.get(0).getBoundingClientRect();
      cy.wrap($el.get(0)).realHover()
        .trigger('dragover', {
          dataTransfer,
        }).wait(1000).trigger('mouseover').wait(1000)
        .trigger('drop', {
          dataTransfer,
          clientX: x + opts.offsetX,
          clientY: y + opts.offsetY,
        }).trigger('dragend', {
          dataTransfer,
        }).trigger('mouseup');
       
    })
  });

【问题讨论】:

    标签: javascript reactjs drag-and-drop node-modules cypress


    【解决方案1】:
        class DndSimulatorDataTransfer {
      constructor(){
          this.data = {};
    
          this.dropEffect = 'move';
        
          this.effectAllowed = 'all';
          this.files = [];
          this.items = [];
          this.types = [];
      }
     
    
      clearData(format) {
        if (format) {
          delete this.data[format]
    
          const index = this.types.indexOf(format)
          delete this.types[index]
          delete this.data[index]
        } else {
          this.data = {}
        }
      }
    
      setData(format, data) {
        this.data[format] = data
        this.items.push(data)
        this.types.push(format)
      }
    
      getData(format) {
        if (format in this.data) {
          return this.data[format]
        }
    
        return ''
      }
    
      setDragImage(img, xOffset, yOffset) {}
    }
      Cypress.Commands.add('reactDnd', {
        prevSubject: 'element',
      }, (sourceSelector, targetSelector, options) => {
        const dataTransfer = new DndSimulatorDataTransfer();
        const opts = {
          offsetX: 100,
          offsetY: 100,
          ...(options || {})
        };
        cy.wrap(sourceSelector.get(0))
          .trigger('dragstart', {
            dataTransfer,
          })
          .trigger('pointercancel', {
            dataTransfer,
            force:true,
          })
          .trigger('drag', {
            force:true,
            dataTransfer,
          })
          .trigger('dragenter', {
            force:true,
            dataTransfer,
          })
          .wait(100);
        cy.get(targetSelector).then($el => {
          const {
            x,
            y,
          } = $el.get(0).getBoundingClientRect();
          cy.wrap($el.get(0))
          .trigger('dragenter', {
            dataTransfer,
          })
          .trigger('drag', {
            dataTransfer,
          })
          .trigger('dragover', {
            dataTransfer,
          })
            .trigger('drop', {
              dataTransfer,
              clientX: x + opts.offsetX,
              clientY: y + opts.offsetY,
              force: true
            })
            .wait(1000);
            cy.wrap(sourceSelector.get(0)).trigger('dragend', {
              dataTransfer,
              force: true
    
            });
        })
      });
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多