Skip to content

Commit 9fb6d9c

Browse files
committed
Replace selenium events with js events
1 parent 319602d commit 9fb6d9c

File tree

1 file changed

+44
-35
lines changed

1 file changed

+44
-35
lines changed

src/Selenium2Driver.php

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,42 +1025,51 @@ public function keyUp(string $xpath, $char, ?string $modifier = null)
10251025

10261026
public function dragTo(string $sourceXpath, string $destinationXpath)
10271027
{
1028-
$source = $this->findElement($sourceXpath);
1029-
$destination = $this->findElement($destinationXpath);
1030-
1031-
$this->getWebDriverSession()->moveto(array(
1032-
'element' => $source->getID()
1033-
));
1034-
1035-
$script = <<<JS
1036-
(function (sourceElement) {
1037-
window['__minkDragAndDropSourceElement'] = sourceElement;
1038-
1039-
sourceElement.dispatchEvent(new DragEvent('dragstart', {bubbles: true, cancelable: true}));
1040-
}({{ELEMENT}}));
1041-
JS;
1042-
$this->executeJsOnElement($source, $script);
1043-
1044-
if ($destination->getID() === $source->getID()) {
1045-
$this->getWebDriverSession()->click(0);
1046-
} else {
1047-
$this->getWebDriverSession()->buttondown();
1048-
$this->getWebDriverSession()->moveto(array(
1049-
'element' => $destination->getID()
1050-
));
1051-
$this->getWebDriverSession()->buttonup();
1052-
}
1053-
1054-
$script = <<<JS
1055-
(function (targetElement) {
1056-
targetElement.dispatchEvent(new DragEvent('dragover', {bubbles: true, cancelable: true}));
1057-
1058-
targetElement.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
1028+
$source = $this->findElement($sourceXpath);
1029+
$target = $this->findElement($destinationXpath);
1030+
1031+
$this->getWebDriverSession()->moveto(['element' => $source->getID()]);
1032+
1033+
$this->executeJsOnElement($source, <<<'JS'
1034+
(function (sourceElement) {
1035+
var withPointerEvents = 'PointerEvent' in window;
1036+
window['__minkDragAndDropSourceElement'] = sourceElement;
1037+
1038+
withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerdown', {bubbles: true, cancelable: true}));
1039+
sourceElement.dispatchEvent(new MouseEvent('mousedown', {bubbles: true, cancelable: true}));
1040+
sourceElement.dispatchEvent(new DragEvent('dragstart', {bubbles: true, cancelable: true}));
1041+
withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointercancel', {bubbles: true, cancelable: true}));
1042+
withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerout', {bubbles: true, cancelable: true}));
1043+
withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerleave', {bubbles: true, cancelable: true}));
1044+
}({{ELEMENT}}));
1045+
JS
1046+
);
10591047

1060-
window['__minkDragAndDropSourceElement'].dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
1061-
}({{ELEMENT}}));
1062-
JS;
1063-
$this->executeJsOnElement($destination, $script);
1048+
$this->getWebDriverSession()->moveto(['element' => $target->getID()]);
1049+
1050+
$this->executeJsOnElement($target, <<<'JS'
1051+
(function (targetElement) {
1052+
var withPointerEvents = 'PointerEvent' in window;
1053+
var sourceElement = window['__minkDragAndDropSourceElement'];
1054+
1055+
withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerover', {bubbles: true, cancelable: true}));
1056+
withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerenter', {bubbles: true, cancelable: true}));
1057+
sourceElement.dispatchEvent(new MouseEvent('mouseout', {bubbles: true, cancelable: true}));
1058+
sourceElement.dispatchEvent(new MouseEvent('mouseleave', {bubbles: true, cancelable: true}));
1059+
targetElement.dispatchEvent(new MouseEvent('mouseover', {bubbles: true, cancelable: true}));
1060+
targetElement.dispatchEvent(new MouseEvent('mouseenter', {bubbles: true, cancelable: true}));
1061+
targetElement.dispatchEvent(new MouseEvent('mousemove', {bubbles: true, cancelable: true}));
1062+
withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerout', {bubbles: true, cancelable: true}));
1063+
withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerleave', {bubbles: true, cancelable: true}));
1064+
targetElement.dispatchEvent(new MouseEvent('mouseout', {bubbles: true, cancelable: true}));
1065+
targetElement.dispatchEvent(new MouseEvent('mouseleave', {bubbles: true, cancelable: true}));
1066+
sourceElement.dispatchEvent(new DragEvent('drag', {bubbles: true, cancelable: true}));
1067+
targetElement.dispatchEvent(new DragEvent('dragover', {bubbles: true, cancelable: true}));
1068+
targetElement.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
1069+
sourceElement.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
1070+
}({{ELEMENT}}));
1071+
JS
1072+
);
10641073
}
10651074

10661075
public function executeScript(string $script)

0 commit comments

Comments
 (0)