DragAndDrop в WebdriverIO

Рейтинг: 0Ответов: 1Опубликовано: 01.07.2023

Подскажите пожалуйста, почему у меня не работает drag and drop в WebdriverIO? Я проверил получение других элементов, чек бокс, все остальные функции - работают отлично, с dragAndDrop проблемы. У меня запускается программа, проходит 5 секунд + 5 секунд ожидание и она закрывается, при этом действий никаких нет. Функции для тестов (main.page.ts):

import { Element } from 'webdriverio';

class MainPage {
    public get itemsTodo (): Element[] {
        return $$('#item-card')
    }

    public get itemsBoard(): Element[] {
        return $$('#column-list')
    }

    public async pause() {
        await browser.pause(5000)
    }

    public async dragAndDropTodo (idTodo: number, idBoard: number) {
        const sourceElement = await this.itemsTodo[idTodo];
        const targetElement = await this.itemsBoard[idBoard];

        await sourceElement.dragAndDrop(targetElement)
    }

    async open() {
        await browser.url('http://localhost:3000/');
    }
}

export default new MainPage();

Сам тест (main.e2e.ts):

import MainPage from "../pageobjects/main.page";

describe('Drag card tests', () => {
    it('Drop card on other board', async () => {
        await MainPage.open();
        await MainPage.dragAndDropTodo(3, 2);
        await MainPage.pause();
    })
})

export {}

Соответственно атрибуты доски:

onDragOver={dragHandleOver}
             onDrop={dragHandleDrop}
             data-testid="column-list"
             id="column-list"

Атрибуты карточки:

     draggable={true}
     onDragStart={dragHandlerStart}
     onDragLeave={dragHandleLeave}
     onDragEnd={dragHandleEnd}
     onDragOver={dragHandleOver}
     onDrop={dragHandleDrop}
     data-testid="item-card"
     id="item-card"

Ниже на скриншоте внешний вид самого представления: введите сюда описание изображения

Буду признателен любой вашей помощи и идеям, почему drag and drop не работает. Ссылка на гит проекта

Ответы

▲ 0

Я так понял у встроенного события dragAndDrop стоят какие-то дефолдные настройки из-за которых не получается перебросить карточку и нужно в ручную эти евенты прописывать. Собственно, вот решение:

await browser.execute(
            (source: WebdriverIO.Element, target: WebdriverIO.Element) => {
                const dragEvent = new DragEvent('dragstart', {
                    bubbles: true,
                    cancelable: true,
                    composed: true,
                    dataTransfer: new DataTransfer(),
                });
                const dropEvent = new DragEvent('drop', {
                    bubbles: true,
                    cancelable: true,
                    composed: true,
                    dataTransfer: new DataTransfer(),
                });

                (source as unknown as HTMLElement).dispatchEvent(dragEvent);
                (target as unknown as HTMLElement).dispatchEvent(dropEvent);
                (source as unknown as HTMLElement).dispatchEvent(new DragEvent('dragend'));
            },
            sourceElement,
            targetElement
        );