【问题标题】:Java - drag and drop not working on selenium 3.8Java - 拖放在 selenium 3.8 上不起作用
【发布时间】:2018-03-20 18:03:45
【问题描述】:

拖放在 selenium 3.8 上不起作用。

Here is the JS code for the element

这是我尝试过的。但它只是选择元素。没有发生保持和下降。

WebElement source = driver.findElement(By.xpath("//tbody[@class ='lt-body']//tr[@data-test-id='table-row-id-20']//td[contains(@id,'ember')]//div[contains(@id,'ember')]//*[name()='svg']//*[name()='ellipse']"));
WebElement destination = driver.findElement(By.xpath("//tbody[@class ='lt-body']//tr[@data-test-id='table-row-id-3']//td[contains(@id,'ember')]//div[contains(@id,'ember')]//*[name()='svg']//*[name()='ellipse']"));

Actions builder = new Actions(driver);
int x2 =destination.getLocation().getX();
int y2 = destination.getLocation().getY();
builder.clickAndHold(source);
builder.moveByOffset(x2,y2);
builder.moveToElement(destination);
builder.release();
builder.perform();

这个也试过了。

builder.clickAndHold(source).moveByOffset(x2,y2).moveToElement(destination).release().build().perform();

也尝试使用机器人。每次我只能看到源元素和目标元素都被选中。但不是拖放。

还尝试了 ActionsChain 的 dragAndDrop。那也没用。

【问题讨论】:

  • 'drag and drop' 应该有自己的动作链方法。我只会使用它,而不是尝试通过组合其他操作来获得相同的行为。见the reference
  • 请阅读为什么是screenshot of HTML or code or error is a bad idea。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。
  • @sytech 也尝试过。不工作。它只是选择源和目标。但拖放没有发生
  • “尝试使用机器人”是什么意思?您是指 robotsframework.org 上提供的工具,还是其他地方?
  • 你可以试试my solution

标签: java selenium selenium-webdriver drag-and-drop


【解决方案1】:

使用以下基于 javascript 的方法。如果给出了两个元素,这是一种非常简洁的拖放方式。这几乎每次都有效。祝你好运。

public void dragAndDrop(WebElement from, WebElement to) {
        js.executeScript("function createEvent(typeOfEvent) {\n" + "var event =document.createEvent(\"CustomEvent\");\n"
                + "event.initCustomEvent(typeOfEvent,true, true, null);\n" + "event.dataTransfer = {\n" + "data: {},\n"
                + "setData: function (key, value) {\n" + "this.data[key] = value;\n" + "},\n"
                + "getData: function (key) {\n" + "return this.data[key];\n" + "}\n" + "};\n" + "return event;\n"
                + "}\n" + "\n" + "function dispatchEvent(element, event,transferData) {\n"
                + "if (transferData !== undefined) {\n" + "event.dataTransfer = transferData;\n" + "}\n"
                + "if (element.dispatchEvent) {\n" + "element.dispatchEvent(event);\n"
                + "} else if (element.fireEvent) {\n" + "element.fireEvent(\"on\" + event.type, event);\n" + "}\n"
                + "}\n" + "\n" + "function simulateHTML5DragAndDrop(element, destination) {\n"
                + "var dragStartEvent =createEvent('dragstart');\n" + "dispatchEvent(element, dragStartEvent);\n"
                + "var dropEvent = createEvent('drop');\n"
                + "dispatchEvent(destination, dropEvent,dragStartEvent.dataTransfer);\n"
                + "var dragEndEvent = createEvent('dragend');\n"
                + "dispatchEvent(element, dragEndEvent,dropEvent.dataTransfer);\n" + "}\n" + "\n"
                + "var source = arguments[0];\n" + "var destination = arguments[1];\n"
                + "simulateHTML5DragAndDrop(source,destination);", from, to);

    }

【讨论】:

  • 非常感谢,但是没有用。它甚至没有选择元素。
  • 只是想知道,您是否通过执行以下操作声明了“js”。公共静态 JavascriptExecutor js;然后将源 WebElement 和目标 WebElement 作为参数提供给上述方法。你能展示一下你是怎么做的代码吗?
  • 嗨@Chuchoo 我试过这个代码但不能这样做
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多