java - 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();
解决方案
根据我实现更稳定的拖放操作的经验,我们从 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 ” )
推荐阅读
- html - Qt 中的 Sphinx 集成
- c - 计算段中的个数(二进制)
- google-admin-sdk - 如何让 Google 群组成为我的 Cloud Identity 的超级管理员
- php - 在 MyAccountController [backpack-laravel] 中添加个人资料信息
- sql-server - 使用记录中的文件路径列使用最新文件更新 varbinary 列
- shared-libraries - 无法打开共享对象文件 libpng12.so.0
- firebase - 我可以在没有通知许可的情况下使用 Firebase 云消息吗?(Javascript)
- swift - 修复 - 线程 1:致命错误:在展开可选值时意外发现 nil
- webview - 我可以将 JavaScript 和 CSS 注入 Xamarin 表单 WebView 吗?
- git - 我可以强制 git 将更改视为一个整体吗?