简体   繁体   English

在Java上使用Selenium WebDriver拖放

[英]Drag and drop with selenium webdriver on java

Drag and drop with selenium webdriver on java 在Java上使用Selenium WebDriver拖放

src:- src:-

<div class="dd"><img alt="World" src="test.png" style="margin-top: -5px;width:auto;height:16px;padding-right:5px;"><span>sample</span></div>

target:- 目标:-

<div id="hierarchy">
<div class="dd" id="tree_nodes">
<ol class="dd-list" id="ancestor">

<li class="dd-item" ><div class="dd-handle"><img alt="testing" src="test2.png" ><a  name="tree" style="margin:5px;">first page</a></div></li>

<li class="dd-item" ><div class="dd-handle"><img alt="testing" src="test2.png" s><a  name="tree" style="margin:5px;">second page</a></div></li>

<li class="dd-item" ><div class="dd-handle"><img alt="testing" src="test2.png" ><a  name="tree" style="margin:5px;">third page</a></div></li>

<li class="dd-item" ><div class="dd-handle"><img alt="testing" src="test2.png" s><a  name="tree" style="margin:5px;">fourth page</a></div></li>

</ol>
</div>


</div>

Am using this code for drag and drop:- 我正在使用此代码进行拖放:-

Actions builder = new Actions(driver);

Action dragAndDrop = builder.clickAndHold(src).moveToElement(trgt).release(trgt).build();

dragAndDrop.perform();

I want to drag the src element to target element(insert as a li tag inside ol of div tag). 我想将src元素拖到目标元素(作为li标签插入div标签的ol中)。 How can i insert as a first or last or intermediate li tag inside ol of div(target element). 我怎样才能作为div(目标元素)的ol的第一个或最后一个或中间li标签插入。

I want to create a li tag(like as li in target element) and then drag the src element to the newly created li tag inside ol(present in target element). 我想创建一个li标签(就像目标元素中的li一样),然后将src元素拖到ol(存在于目标元素中)中新创建的li标签。

How do i create a li tag in selenium ? 如何在硒中创建li标签?

It works for me.. 这个对我有用..

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);

}

I faced issues with Selenium Actions Drag and drop. 我遇到Selenium Actions拖放问题。 The above code was the solution for me. 上面的代码是我的解决方案。

Use 使用

Actions builder = new Actions(driver);

builder.dragAndDrop(src,trgt).build().perform();

Before this Please check src and trgt are properly able to identify the objects. 在此之前,请检查src和trgt是否能够正确识别对象。

Thanks. 谢谢。 Arun 阿伦

You cannot create elements using Selenium. 您不能使用Selenium创建元素。 Selenium is meant for testing web applications not to modify the source code. Selenium用于测试Web应用程序,而不修改源代码。

Although as an exception, you can use javascript to modify the source. 尽管作为例外,您可以使用javascript来修改源。

Webdriver is designed for browser automation, not for changing server side code or HTML returned by the server. Webdriver设计用于浏览器自动化,而不用于更改服务器端代码或服务器返回的HTML。 However, if you want to change the HTML temporarily on the client side, you'll have to do what everyone else does and run some JavaScript on the browser. 但是,如果要在客户端临时更改HTML,则必须执行其他所有人的操作,并在浏览器上运行一些JavaScript。

you can execute JavaScript with a WebDriver instance by casting it into a JavascriptExecutor: 您可以通过将WebDriver实例转换为JavascriptExecutor来执行JavaScript:

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");

Then you can use JavaScript to manipulate the DOM inside the page being shown on the browser that your WebDriver instance is currently driving. 然后,您可以使用JavaScript来操纵WebDriver实例当前正在驱动的浏览器上显示的页面内的DOM。

I referrred below link: How to create a li tag dynamically using selenium webdriver on java 我引用了以下链接: 如何在Java上使用Selenium Webdriver动态创建li标签

you can user for loop to drap element from one position to multiple position. 您可以使用循环将元素从一个位置悬垂到多个位置。

public static void dragdrop(){
    WebElement slider = driver.findElement(By.id("dragdrop"));
    int width=slider.getSize().getWidth();   // Width of SLider
    Actions move = new Actions(driver);
    move.moveToElement(slider, ((width*10)/100), 0).click();  // move to a specific point on the dragpoint
    move.build().perform();
       System.out.println("Slider moved");
      }

OR 要么

// Move element from one position to other position. //将元素从一个位置移动到另一位置。

 public void dragdrop(){
     WebElement element = driver.findElement(By.name("source")); 

     WebElement target = driver.findElement(By.name("target"));

   (new Actions(driver)).dragAndDrop(element, target).perform();

}

try below code 尝试下面的代码

WebElement LocatorFrom=driver.findElement(By.xpath("(.//*[normalize-space(text()) and 
normalize-space(.)='Items to Drag'])[1]/following::span[1]"));  

 //Element on which need to drop.       
 WebElement LocatorTo=driver.findElement(By.id("mydropzone"));  
 String xto=Integer.toString(LocatorTo.getLocation().x);
String yto=Integer.toString(LocatorTo.getLocation().y);
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);",LocatorFrom, LocatorTo);
Thread.sleep(1500);

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

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