簡體   English   中英

在Java上使用Selenium WebDriver拖放

[英]Drag and drop with selenium webdriver on java

在Java上使用Selenium WebDriver拖放

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>

目標:-

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

我正在使用此代碼進行拖放:-

Actions builder = new Actions(driver);

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

dragAndDrop.perform();

我想將src元素拖到目標元素(作為li標簽插入div標簽的ol中)。 我怎樣才能作為div(目標元素)的ol的第一個或最后一個或中間li標簽插入。

我想創建一個li標簽(就像目標元素中的li一樣),然后將src元素拖到ol(存在於目標元素中)中新創建的li標簽。

如何在硒中創建li標簽?

這個對我有用..

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

}

我遇到Selenium Actions拖放問題。 上面的代碼是我的解決方案。

使用

Actions builder = new Actions(driver);

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

在此之前,請檢查src和trgt是否能夠正確識別對象。

謝謝。 阿倫

您不能使用Selenium創建元素。 Selenium用於測試Web應用程序,而不修改源代碼。

盡管作為例外,您可以使用javascript來修改源。

Webdriver設計用於瀏覽器自動化,而不用於更改服務器端代碼或服務器返回的HTML。 但是,如果要在客戶端臨時更改HTML,則必須執行其他所有人的操作,並在瀏覽器上運行一些JavaScript。

您可以通過將WebDriver實例轉換為JavascriptExecutor來執行JavaScript:

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

然后,您可以使用JavaScript來操縱WebDriver實例當前正在驅動的瀏覽器上顯示的頁面內的DOM。

我引用了以下鏈接: 如何在Java上使用Selenium Webdriver動態創建li標簽

您可以使用循環將元素從一個位置懸垂到多個位置。

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

要么

//將元素從一個位置移動到另一位置。

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

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

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

}

嘗試下面的代碼

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