我正在测试一个剑道应用程序并尝试了 Selena's answer 中的解决方案,但它是一个不同的解决方案,最终对我有用,包括 Safari 14。
Test application.
Working drap and drop(使用 WebElements 而不是 CSS 字符串的小改动):
var triggerDragAndDrop = function (elemDrag, elemDrop) {
/* function for triggering mouse events */
var fireMouseEvent = function (type, elem, centerX, centerY) {
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent(
type,
true,
true,
window,
1,
1,
1,
centerX,
centerY,
false,
false,
false,
false,
0,
elem
);
elem.dispatchEvent(evt);
};
/* calculate positions*/
var pos = elemDrag.getBoundingClientRect();
var center1X = Math.floor((pos.left + pos.right) / 2);
var center1Y = Math.floor((pos.top + pos.bottom) / 2);
pos = elemDrop.getBoundingClientRect();
var center2X = Math.floor((pos.left + pos.right) / 2);
var center2Y = Math.floor((pos.top + pos.bottom) / 2);
/* mouse over dragged element and mousedown*/
fireMouseEvent('mousemove', elemDrag, center1X, center1Y);
fireMouseEvent('mouseenter', elemDrag, center1X, center1Y);
fireMouseEvent('mouseover', elemDrag, center1X, center1Y);
fireMouseEvent('mousedown', elemDrag, center1X, center1Y);
/* start dragging process over to drop target*/
fireMouseEvent('dragstart', elemDrag, center1X, center1Y);
fireMouseEvent('drag', elemDrag, center1X, center1Y);
fireMouseEvent('mousemove', elemDrag, center1X, center1Y);
fireMouseEvent('drag', elemDrag, center2X, center2Y);
fireMouseEvent('mousemove', elemDrop, center2X, center2Y);
/* trigger dragging process on top of drop target*/
fireMouseEvent('mouseenter', elemDrop, center2X, center2Y);
fireMouseEvent('dragenter', elemDrop, center2X, center2Y);
fireMouseEvent('mouseover', elemDrop, center2X, center2Y);
fireMouseEvent('dragover', elemDrop, center2X, center2Y);
/* release dragged element on top of drop target*/
fireMouseEvent('drop', elemDrop, center2X, center2Y);
fireMouseEvent('dragend', elemDrag, center2X, center2Y);
fireMouseEvent('mouseup', elemDrag, center2X, center2Y);
return true;
};
根据 Selena 上述答案中的解决方案注入 javascript(将文件读入变量 java_script)。针对现有的 WebElements(drag 和 drop)执行:
String js = "var src = arguments[0];var dest = arguments[1];";
js += "triggerDragAndDrop(src, dest);";
JavascriptExecutor executor = (JavascriptExecutor) webdriver;
executor.executeScript(java_script + js, drag, drop);