【问题标题】:Selenium Drag and drop not working with Action methods, Is there any alterativeSelenium 拖放不适用于 Action 方法,有没有其他选择
【发布时间】:2020-06-25 08:50:21
【问题描述】:
  1. 拖放硒

    WebElement source = driver.findElement(By.cssSelector(locator1));
    WebElement target = driver.findElement(By.cssSelector(locator2));
    Actions act = new Actions(driver);
    

(选项1)

     act.moveToElement(source) .pause(Duration.ofSeconds(1)) .clickAndHold(source)
      .pause(Duration.ofSeconds(1)) .moveByOffset(1, 0) .moveToElement(target)
     .moveByOffset(1, 0) .pause(Duration.ofSeconds(1)) .release().perform();
      System.out.println();
  1. 选项2

    act.clickAndHold(source).pause(2000) .moveToElement(目标) .release().build().perform();

我已经尝试了这两个选项,我正在开发 Selenium 3,有没有其他方法可以实现它。

注意:不推荐机器人类

【问题讨论】:

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


【解决方案1】:

这是使用操作的拖放功能

public void dragAndDrop(WebElement from, WebElement to) {
        Actions action = new Actions(driver);
        action.dragAndDrop(from,to).perform();
    }

这是使用 JSExecutor:

public void dragAndDrop(WebElement from, WebElement to) {
        JavascriptExecutor js = (JavascriptExecutor)driver;
        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);
    }
    

更新:

        WebElement a = driver.findElement(By.cssSelector("a:nth-child(1)"));
        WebElement b = driver.findElement(By.cssSelector("a:nth-child(2)"));

        int x = b.getLocation().x;
        int y = b.getLocation().y;

        Actions actions = new Actions(driver);
        actions.moveToElement(a)
                .pause(Duration.ofSeconds(1))
                .clickAndHold(a)
                .pause(Duration.ofSeconds(1))
                .moveByOffset(x, y)
                .moveToElement(b)
                .moveByOffset(x,y)
                .pause(Duration.ofSeconds(1))
                .release().build().perform();

【讨论】:

  • react-beautiful-dnd.netlify.app/… Source Element----->"//*[text()='有时候生活是可怕而黑暗的']", toElement ---->"//*[ text()='Suck at something is the first step to be sorta good at something.']",它在这个网站上不起作用,你能帮帮我吗。
  • 现在它正在工作,我尝试了不同的方法,这个正在工作,评论太长了,我已经更新了我的答案。让我知道你的结果。
  • 它也对我有用,但是在这里尝试时它不起作用artoftesting.com/samplesiteforselenium
  • 在这种情况下,您可以使用我回答中的第二部分(使用 JSExecutor)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2021-04-07
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多