• 如何解决selenium的dragAndDrop失效的问题


    这个问题烦恼了快2天,网上的回答很混乱,那些乱七八糟的回答往往让人误入歧途,终于在这个找到了问题明确的原因和解决方案,请参照下面的网站

    Selenium Drag and Drop Bug Workaround

    您是否遇到过众所周知的 Selenium问题,即 拖放手势在某些情况下不适用于 Selenium ?这个错误已经存在多年。

    介绍

    拖放 是当一个元素被拖到某个其他元素或位置之上时的一个动作。Selenium有一个错误,使该操作无法进行,并且已经存在多年。

    问:是什么导致拖放问题?

    答案:此手势包含 3 个动作:单击并按住、将鼠标移动到其他元素/位置、释放鼠标。问题都与最后一个动作(释放鼠标)有关。当 Selenium 向 webdriver API 发送请求以释放鼠标时,在某些情况下它会一直按住鼠标。

    解决方法

    通过 webdriver API向浏览器发送JavaScript代码。因此代码使用JavaScript模拟拖放操作,而不是 webdriver 方法。

    问:为什么不将修复程序包含在Selenium包中?

    答:拖放 错误是一个webdriver问题, 因此您在Selenium方面所能做的就是简单地执行与我相同的解决方法。我与David Burnes(Selenium 核心提交者)讨论了将该变通办法推入Selenium的问题,但他说在Selenium 本身中提供任何变通办法并不是一个好主意。这就是为什么我必须创建一个单独的包来帮助测试自动化社区解决这个问题。

    py程序在这里 

    Selenium - HTML5 drag and drop · GitHub
     

    把上面的js改编成groovy(java)如下 ,并加上了对elementUI的特殊对应

    1. WebElement From = driver.findElement(By.xpath("//table[@class='el-table__body']//tr[1]"));
    2. WebElement To = driver.findElement(By.xpath("//div[@class='el-tree-node__content' and descendant::span[text()='未分類']]"));
    3. new Actions(driver)
    4. .clickAndHold(From)
    5. .perform();
    6. final String java_script = """
    7. var args = arguments,
    8. callback = args[args.length - 1],
    9. source = args[0],
    10. target = args[1],
    11. offsetX = (args.length > 2 && args[2]) || 0,
    12. offsetY = (args.length > 3 && args[3]) || 0,
    13. delay = (args.length > 4 && args[4]) || 1;
    14. if (!source.draggable) throw new Error('Source element is not draggable.');
    15. var doc = source.ownerDocument,
    16. win = doc.defaultView,
    17. rect1 = source.getBoundingClientRect(),
    18. rect2 = target ? target.getBoundingClientRect() : rect1,
    19. x = rect1.left + (rect1.width >> 1),
    20. y = rect1.top + (rect1.height >> 1),
    21. x2 = rect2.left + (rect2.width >> 1) + offsetX,
    22. y2 = rect2.top + (rect2.height >> 1) + offsetY,
    23. dataTransfer = Object.create(Object.prototype, {
    24. _items: { value: { } },
    25. effectAllowed: { value: 'all', writable: true },
    26. dropEffect: { value: 'move', writable: true },
    27. files: { get: function () { return undefined } },
    28. types: { get: function () { return Object.keys(this._items) } },
    29. setData: { value: function (format, data) { this._items[format] = data } },
    30. getData: { value: function (format) { return this._items[format] } },
    31. clearData: { value: function (format) { delete this._items[format] } },
    32. setDragImage: { value: function () { } }
    33. });
    34. target = doc.elementFromPoint(x2, y2);
    35. if(!target) throw new Error('The target element is not interactable and need to be scrolled into the view.');
    36. rect2 = target.getBoundingClientRect();
    37. emit(source, 'dragstart', delay, function () {
    38. var rect3 = target.getBoundingClientRect();
    39. x = rect3.left + x2 - rect2.left;
    40. y = rect3.top + y2 - rect2.top;
    41. emit(target, 'dragenter', 1, function () {
    42. emit(target, 'dragover', delay, function () {
    43. target = doc.elementFromPoint(x, y);
    44. emit(target, 'drop', 1, function () {
    45. emit(source, 'dragend', 1, callback);
    46. });});});});
    47. function emit(element, type, delay, callback) {
    48. var event = doc.createEvent('DragEvent');
    49. event.initMouseEvent(type, true, true, win, 0, 0, 0, x, y, false, false, false, false, 0, null);
    50. Object.defineProperty(event, 'dataTransfer', { get: function () { return dataTransfer } });
    51. element.dispatchEvent(event);
    52. win.setTimeout(callback, delay);
    53. }
    54. """
    55. ((JavascriptExecutor)driver).executeScript(java_script, From, To, null, null, 101);

    下面这段代码的意思是在拖动前先clickAndHold这个元素,在elementui中,拖放前draggable属性才会从"false"变成"true",clickAndHold的目的就是让draggable属性变成"true",否则js会出错。

    new Actions(driver)
                    .clickAndHold(From)
                    .perform(); 


     

  • 相关阅读:
    LeetCode | 719. Find K-th Smallest Pair Distance
    使用Redis查询数据库数据增加访问速度小案例
    2022年全球及中国工程机械行业头部企业市场占有率及排名调研报告
    百度地图——鹰眼轨迹服务
    第十五章 图的BFS与拓扑序列
    MATLAB算法实战应用案例精讲-【概念篇】大模型
    获取Flink作业在HDFS上保存的最新的savepoint文件路径
    相对于java,C++中的那些神奇语法
    如何在响应头中防治xss
    webpack拓展篇(六十七):webpack5 新特性解析
  • 原文地址:https://blog.csdn.net/robinspada/article/details/126760392