首页 > 解决方案 > Selenium 网络驱动程序 | 拖放功能 | 没有异常,但代码不起作用

问题描述

我正在尝试将徽标拖放到容器中,但没有出现异常。我能够找到元素,并且相同的拖放代码适用于具有其他元素的另一个站点。但不知道为什么这在这里不起作用。任何人都可以提供帮助。

// 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();

标签: javaseleniumselenium-webdriverautomationbrowser-automation

解决方案


根据我实现更稳定的拖放操作的经验,我们从 Actions 实现切换到 javascript 实现。是的,它可能看起来像一个 hack,但测试结果的持续假阴性使我们衡量风险并使用 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

ps您的问题的链接中有错字。(而不是“asp? ilename ”应该是“asp? filename ” )


推荐阅读