【问题标题】:Unable to perform drag and drop action even code executed without any error即使代码执行没有任何错误,也无法执行拖放操作
【发布时间】:2016-09-28 07:55:42
【问题描述】:

在 AnjularJS 应用程序中无法看到拖动的元素,即使执行拖放操作没有任何错误。

下面是代码:

WebElement draggable = driver.findElement(By.xpath("//*[@id='page-content-wrapper']/div[2]/div[3]/div[4]/div/div[2]/div/div/div[2]/div/div[1]/ul/li/ul/li[2]/span/span[1]"));
WebElement droppable = driver.findElement(By.xpath(".//*[@id='page-content-wrapper']/div[2]/div[3]/div[3]/div[2]/div[1]/div[1]/div/div[6]/div[2]/div[1]"));

以下是不同的方法执行和执行没有错误:

1)
Actions builder = new Actions(driver);
        builder.keyDown(Keys.CONTROL).click(draggable).click(droppable). keyUp(Keys.CONTROL).build().perform();

2)Method 2
Actions builder = new Actions(driver);
            builder.clickAndHold(draggable).moveToElement(droppable).build();
            builder.dragAndDrop(draggable, droppable).perform();

3)Method 3
Actions action = new Actions(driver); 
            Thread.sleep(1000);
            action.clickAndHold(draggable2).build().perform();
            action.moveToElement(droppable2).build().perform();
            action.release(droppable2).build().perform();

4)
Method 4
Actions actions = new Actions(driver); 
        browser.actions()
        .mouseDown(draggable2)
        .mouseMove(draggable2)
        .mouseUp(droppable2)
        .perform();

还执行了 JavaScript 方法:但运气不好,它也执行没有错误但无法在 UIenter image description here 中执行拖放操作@

    A) public static void DragAndDropJS2(WebElement source, WebElement destination, WebDriver driver) throws Exception 
    {
       // JavascriptExecutor js = (JavascriptExecutor) driver;
        String xto=Integer.toString(source.getLocation().x);
        String yto=Integer.toString(destination.getLocation().y);
        ((JavascriptExecutor)driver).executeScript("function simulate(f,c,d,e){var b,a=null;for(b in eventMatchers)if(eventMatchers[b].test(c)){a=b;break}if(!a)return!1;document.createEvent?(b=document.createEvent(a),a==\"HTMLEvents\"?b.initEvent(c,!0,!0):b.initMouseEvent(c,!0,!0,document.defaultView,0,d,e,d,e,!1,!1,!1,!1,0,null),f.dispatchEvent(b)):(a=document.createEventObject(),a.detail=0,a.screenX=d,a.screenY=e,a.clientX=d,a.clientY=e,a.ctrlKey=!1,a.altKey=!1,a.shiftKey=!1,a.metaKey=!1,a.button=1,f.fireEvent(\"on\"+c,a));return!0} var eventMatchers={HTMLEvents:/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,MouseEvents:/^(?:click|dblclick|mouse(?:down|up|over|move|out))$/}; " +
                "simulate(arguments[0],\"mousedown\",0,0); simulate(arguments[0],\"mousemove\",arguments[1],arguments[2]); simulate(arguments[0],\"mouseup\",arguments[1],arguments[2]); ",
                source,xto,yto);

    }



    B) public static void DragAndDropJS(WebElement source, WebElement destination, WebDriver driver) throws Exception 
    {
        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);",source, destination);
        Thread.sleep(1500);

    }



    c) public static void DragAndDropJS1(WebElement source, WebElement destination, WebDriver driver) throws Exception 
    {
        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" +"}\n" +"\n" +"var source = arguments[0];\n" +"var destination = arguments[1];\n" +"simulateHTML5DragAndDrop(source,destination);",source, destination);
        Thread.sleep(1500);   
    }

上面提到的所有方法和命令都编译并执行没有任何错误但无法在UI中执行拖放操作(请帮助)。

尝试了我知道的所有可能的组合,有人可以告诉我我错过了什么吗? 仅供参考,我使用 Chrome 53 和 Firefox 42 会有什么不同吗? 有没有其他工具可以满足我的要求?

【问题讨论】:

    标签: java selenium-webdriver


    【解决方案1】:

    只要确保网页中的元素不是 HTML5 网页元素即可。因为 selenium 不支持对 HTML5 元素执行操作。

    查看http://elementalselenium.com/tips/39-drag-and-drop,了解如何使用 javascript 对 HTML5 元素执行拖放操作。

    这个帖子也可以帮助你 - Error when trying to execute drag and drop using javascript for Selenium WebDriver test

    【讨论】:

    • 嗨 Sudharsan,这似乎只是 HTML5 Web 元素,因为 Selenium 和带有 Jquery 方法的 Java 脚本都不会影响元素。感谢您的回复和信息如果没有 Selenium 是否还有其他工具适用于 Angular JS 应用程序(特别是拖放操作)?谁能告诉我任何适合我要求的工具。
    • 问题已通过使用 SIKULI 工具解决(即使用基于图像的识别)能够执行拖放操作。
    • 屏幕屏幕=新屏幕(); Pattern ClickDrag=new Pattern("C:\\Users\\sridharp\\Desktop\\Sridhar\\ExpStudio\\ClickDrag.JPG"); Pattern ClickDrop1=new Pattern("C:\\Users\\sridharp\\Desktop\\Sridhar\\ExpStudio\\ClickDrop1.JPG"); screen.dragDrop(ClickDrag, ClickDrop1);
    • 谢谢帮助:)
    • 使用 sikuli 也是一个不错的选择!!但唯一的问题是浏览器窗口应该始终处于焦点位置,我不知道 sikuli 是否可以与无头自动化一起使用。只需确保您的浏览器在执行期间始终处于焦点位置
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2020-07-27
    • 2022-01-18
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多