简体   繁体   English

如何在Selenium Java中的特定位置拖放?

[英]How to drag & drop in specific position in selenium java?

I am trying to drag & drop 2 elements into my workspace but they are dropped over each other, how can i specify the position of dropping the elements? 我正在尝试将2个元素拖放到我的工作区中,但它们之间是相互放置的,我如何指定放置元素的位置?

I am using dragAndDrop() function 我正在使用dragAndDrop()函数

Actions act=new Actions(driver);
act.dragAndDrop(From, To).build().perform(); 

enter image description here 在此处输入图片说明

Using dragAndDrop() method you can perform drag and drop operations on only one location at a time. 使用dragAndDrop()方法,您一次只能在一个位置上执行拖放操作。 it is usually used to perform operations on web element which is capable of dropping. 它通常用于对可删除的Web元素执行操作。 please find the reference http://demoqa.com/droppable/ for various types of dropable elements. 有关各种类型的可放置元素的信息,请参见http://demoqa.com/droppable/

To implement drag and drop operation - 要实现拖放操作-

Example: 例:

 WebElement From=driver.findElement(By.xpath( <<source xpath>> ));
 WebElement To=driver.findElement(By.xpath( <<destination xpath>> ));
 Actions actions=new Actions(driver);
 actions.dragAndDrop(From, To).build().perform(); 

to drag and drop another element, you need to perform above all steps again. 要拖放其他元素,您需要再次执行所有以上步骤。

Hope this helps :) 希望这可以帮助 :)

Try Using below code : 尝试使用以下代码:

 public static  void dragAndDropViaJQueryHelper(WebDriver driver, String dragSourceJQuerySelector, String dropTargetJQuerySelector) {
        String jqueryScript = "(function( jquery ) {\r\n" + 
                "        jquery.fn.simulateDragDrop = function(options) {\r\n" + 
                "                return this.each(function() {\r\n" + 
                "                        new jquery.simulateDragDrop(this, options);\r\n" + 
                "                });\r\n" + 
                "        };\r\n" + 
                "        jquery.simulateDragDrop = function(elem, options) {\r\n" + 
                "                this.options = options;\r\n" + 
                "                this.simulateEvent(elem, options);\r\n" + 
                "        };\r\n" + 
                "        jquery.extend(jquery.simulateDragDrop.prototype, {\r\n" + 
                "                simulateEvent: function(elem, options) {\r\n" + 
                "                        /*Simulating drag start*/\r\n" + 
                "                        var type = 'dragstart';\r\n" + 
                "                        var event = this.createEvent(type);\r\n" + 
                "                        this.dispatchEvent(elem, type, event);\r\n" + 
                "\r\n" + 
                "                        /*Simulating drop*/\r\n" + 
                "                        type = 'drop';\r\n" + 
                "                        var dropEvent = this.createEvent(type, {});\r\n" + 
                "                        dropEvent.dataTransfer = event.dataTransfer;\r\n" + 
                "                        this.dispatchEvent(jquery(options.dropTarget)[0], type, dropEvent);\r\n" + 
                "\r\n" + 
                "                        /*Simulating drag end*/\r\n" + 
                "                        type = 'dragend';\r\n" + 
                "                        var dragEndEvent = this.createEvent(type, {});\r\n" + 
                "                        dragEndEvent.dataTransfer = event.dataTransfer;\r\n" + 
                "                        this.dispatchEvent(elem, type, dragEndEvent);\r\n" + 
                "                },\r\n" + 
                "                createEvent: function(type) {\r\n" + 
                "                        var event = document.createEvent(\"CustomEvent\");\r\n" + 
                "                        event.initCustomEvent(type, true, true, null);\r\n" + 
                "                        event.dataTransfer = {\r\n" + 
                "                                data: {\r\n" + 
                "                                },\r\n" + 
                "                                setData: function(type, val){\r\n" + 
                "                                        this.data[type] = val;\r\n" + 
                "                                },\r\n" + 
                "                                getData: function(type){\r\n" + 
                "                                        return this.data[type];\r\n" + 
                "                                }\r\n" + 
                "                        };\r\n" + 
                "                        return event;\r\n" + 
                "                },\r\n" + 
                "                dispatchEvent: function(elem, type, event) {\r\n" + 
                "                        if(elem.dispatchEvent) {\r\n" + 
                "                                elem.dispatchEvent(event);\r\n" + 
                "                        }else if( elem.fireEvent ) {\r\n" + 
                "                                elem.fireEvent(\"on\"+type, event);\r\n" + 
                "                        }\r\n" + 
                "                }\r\n" + 
                "        });\r\n" + 
                "})(jQuery);";
        ((JavascriptExecutor) driver).executeScript(jqueryScript);
        String dragAndDropScript = "jQuery('" + dragSourceJQuerySelector + "').simulateDragDrop({ dropTarget: '" + dropTargetJQuerySelector + "'});";
        ((JavascriptExecutor) driver).executeScript(dragAndDropScript);
    }

Just pass css or xpath selectors in parameters. 只需在参数中传递css或xpath选择器即可。 Hope that helps you. 希望对您有帮助。 If that does not help you I can help you out with some other solutions also. 如果那对您没有帮助,我也可以为您提供其他解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM