我正在尝试将徽标拖放到容器中,但没有得到异常。我能够找到元素,并且相同的拖放代码适用于具有其他元素的另一个站点。但不知道为什么这在这里不起作用。任何人都可以协助。
// Searching elements
driver.get(https://www.w3schools.com/html/tryit.asp?ilename=tryhtml5_draganddrop");
driver.switchTo().frame(driver.findElement(By.name("iframeResult")));
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);
WebElement From = driver.findElement(By.id("drag1"));
WebElement To = driver.findElement(By.id("div1"));
//Drag and Drop Action
Actions builder = new Actions(driver);
Action DragnDrop = builder.clickAndHold(From).moveToElement(To).release(To).build();
DragnDrop.perform();
根据我的经验,为了实现更稳定的拖放操作,我们从操作实现切换到 JavaScript 实现。是的,它可能看起来像一个黑客,但测试结果的持续假阴性使我们衡量风险并使用 js impl。(我们没有从头开始创建脚本,只是应用了互联网上的多个建议(
您可以将其用于您的案例,添加下面的代码而不是您使用的操作。
driver.executeScript("function dnd(elemDrag, elemDrop) {n" +
" var DELAY_INTERVAL_MS = 100;n" +
" var MAX_TRIES = 10;n" +
" var dragStartEvent;n" +
" if (!elemDrag || !elemDrop) {n" +
" return false;n" +
" }n" +
" function fireMouseEvent(type, elem, dataTransfer) {n" +
" var evt = document.createEvent('MouseEvents');n" +
" evt.initMouseEvent(type, true, true, window, 1, 1, 1, 0, 0, false, false, false, false, 0, elem);n" +
" if (/^dr/i.test(type)) {n" +
" evt.dataTransfer = dataTransfer || createNewDataTransfer();n" +
" }n" +
" elem.dispatchEvent(evt);n" +
" return evt;n" +
" }n" +
" function createNewDataTransfer() {n" +
" var data = {};n" +
" return {n" +
" clearData: function (key) {n" +
" if (key === undefined) {n" +
" data = {};n" +
" } else {n" +
" delete data[key];n" +
" }n" +
" },n" +
" getData: function (key) {n" +
" return data[key];n" +
" },n" +
" setData: function (key, value) {n" +
" data[key] = value;n" +
" },n" +
" setDragImage: function () {n" +
" },n" +
" dropEffect: 'none',n" +
" files: [],n" +
" items: [],n" +
" types: []n" +
" }n" +
" }n" +
" fireMouseEvent('mousedown', elemDrag);n" +
" dragStartEvent = fireMouseEvent('dragstart', elemDrag);n" +
" function dragover() {n" +
" fireMouseEvent('dragover', elemDrop, dragStartEvent.dataTransfer);n" +
" }n" +
" function drop() {n" +
" fireMouseEvent('drop', elemDrop, dragStartEvent.dataTransfer);n" +
" fireMouseEvent('mouseup', elemDrop);n" +
" fireMouseEvent('dragend', elemDrag);n" +
" }n" +
" setTimeout(dragover, DELAY_INTERVAL_MS);n" +
" setTimeout(drop, DELAY_INTERVAL_MS * 2);n" +
" return true;n" +
"}n" +
" dnd(arguments[0], arguments[1])", From, To)
来源: https://github.com/WileyLabs/teasy/blob/master/src/main/java/com/wiley/utils/JsActions.java
附言您的问题的链接中有错别字。(而不是"asp?Ilename"应该是"ASP?文件名(