Я пытаюсь перетащить элемент с боковой панели в форму. Перетащите код, который я написал, как показано ниже.
Actions builder = new Actions(driver);
builder.dragAndDrop(source, target).build().perform();
Это прекрасно работает во всех браузерах, кроме IE11.
Я пробовал другие подходы, такие как
Подход 1 -
builder.clickAndHold(source)
.moveToElement(target)
.release(target)
.build()
.perform();
Подход 2 -
builder.clickAndHold(source)
.pause(Duration.ofSeconds(1))
.moveByOffset(-1, -1)
.pause(Duration.ofSeconds(1))
.moveToElement(target)
.pause(Duration.ofSeconds(1))
.moveToElement(target)
.pause(Duration.ofSeconds(1))
.release(target)
.build()
.perform();
, но ничего не работает.
Над всеми опциями ничего не делается на странице, но они выполняются без ошибок. Я также перепробовал все решения javascript, приведенные в разных ссылках stackoverflow / gitHub, но ничего не работает.
Может кто-нибудь помочь мне в этом?
Редактировать 1-
Как я упоминал ранее, я перепробовал все возможные / упомянутые решения, но ни одно из них не работает. Вот мой код.
package dragAndDrop;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.testng.annotations.Test;
public class DryRunIE{
WebDriver driver;
@Test
public void dragAndDrop() {
System.setProperty("webdriver.ie.driver", System.getProperty("user.dir") + "/Drivers/IEDriverServer.exe");
driver = new InternetExplorerDriver();
driver.get("https://jqueryui.com/droppable/");
driver.manage().window().maximize();
driver.switchTo().frame(0);
try {
//simulateDragAndDrop(driver.findElement(By.id("draggable")), driver.findElement(By.id("droppable")));
//simulateDragDrop(driver.findElement(By.id("draggable")), driver.findElement(By.id("droppable")));
dragAndDropHelper();
} catch (Exception e) {
e.printStackTrace();
}
driver.quit();
try {
Runtime.getRuntime().exec("taskkill /F /IM IEDriverServer.exe");
} catch (IOException e) {
e.printStackTrace();
}
}
private void simulateDragAndDrop(WebElement elementToDrag, WebElement target) throws Exception {
JavascriptExecutor js = (JavascriptExecutor) driver;
String script = "function createEvent(typeOfEvent) {" + "var event = document.createEvent(\"CustomEvent\");"
+ "event.initCustomEvent(typeOfEvent,true, true, null); " + "event.dataTransfer = { " + "data: {}, "
+ "setData: function (key, value) { this.data[key] = value; }, " + "getData: function (key) { "
+ "return this.data[key]; " + "} " + "}; " + "return event;" + "}"
+ "function dispatchEvent(element, event,transferData) { " + "" + "if (transferData !== undefined) { "
+ "event.dataTransfer = transferData; " + "} " + "" + "if (element.dispatchEvent) { "
+ "element.dispatchEvent(event); " + "} " + "" + "else if (element.fireEvent) { "
+ "element.fireEvent(\"on\" + event.type,event); " + "}" + "}" + ""
+ "function simulateHTML5DragAndDrop(element,target) { "
+ "var dragStartEvent =createEvent('dragstart'); " + "dispatchEvent(element, dragStartEvent); "
+ "var dropEvent = createEvent('drop'); "
+ "dispatchEvent(target, dropEvent,dragStartEvent.dataTransfer); "
+ "var dragEndEvent = createEvent('dragend'); "
+ "dispatchEvent(element, dragEndEvent,dropEvent.dataTransfer);" + "}" + ""
+ "var elementToDrag = arguments[0];" + "var targetElem = arguments[1];" + ""
+ "simulateHTML5DragAndDrop(elementToDrag,targetElem);";
js.executeScript(script, elementToDrag, target);
}
private void simulateDragDrop(WebElement ele_source, WebElement ele_target) {
final String JS_DnD =
"var src=arguments[0],tgt=arguments[1];var dataTransfer={dropEffe" +
"ct:'',effectAllowed:'all',files:[],items:{},types:[],setData:fun" +
"ction(format,data){this.items[format]=data;this.types.append(for" +
"mat);},getData:function(format){return this.items[format];},clea" +
"rData:function(format){}};var emit=function(event,target){var ev" +
"t=document.createEvent('Event');evt.initEvent(event,true,false);" +
"evt.dataTransfer=dataTransfer;target.dispatchEvent(evt);};emit('" +
"dragstart',src);emit('dragenter',tgt);emit('dragover',tgt);emit(" +
"'drop',tgt);emit('dragend',src);";
// drag and drop item two into the bin
((JavascriptExecutor)driver).executeScript(JS_DnD, ele_source, ele_target);
}
private void dragAndDropHelper() {
String script = null;
try {
script = readFile(System.getProperty("user.dir") + "\\drag_and_drop_helper.js");
} catch (IOException e) {
e.printStackTrace();
}
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(script + "$('#draggable').simulateDragDrop({ dropTarget: '#droppable'});");
System.out.println();
}
// helper method
private static String readFile(String file) throws IOException {
Charset cs = Charset.forName("UTF-8");
FileInputStream stream = new FileInputStream(file);
try {
Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
StringBuilder builder = new StringBuilder();
char[] buffer = new char[8192];
int read;
while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
builder.append(buffer, 0, read);
}
return builder.toString();
} finally {
stream.close();
}
}
}
Я попробовал приведенную ниже функцию одну за другой, раскомментируя и выполняя, но все они выполняются успешно, и ничего не происходит на странице.
Примечание: я получил drag_and_drop_helper. js от https://gist.github.com/rcorreia/2362544.
Есть что-то, что я здесь упускаю или делаю неправильно?
Спасибо, Чандреш Пармар