J'essaie de faire glisser et déposez un élément du panneau latéral pour former. Faites glisser et déposer le code ce que j'ai écrit, c'est comme ci-dessous. Ceci fonctionne bien dans tous les navigateurs sauf IE11. P> J'ai essayé d'autres approches telles que P> Approche 1 - P> 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();
}
}
}
4 Réponses :
semble être un problème connu avec IE11 que personne n'a été capable de réparer. p>
Il y a une question de GitHub pertinente ouverte dans le référentiel de Sélénium, mais il a été fermé en raison du manque d'un exemple de travail, reproductible: p>
https://github.com/seleniumhq/selenium/issues/6354 p>
Les autres utilisateurs de Stackexchange ont vu ce problème depuis 2016, sans réelle résolution: p>
Impossible d'automatiser la traînée et la chute pour IE11: Selenium webdiver (aucune résolution de travail) p>
https: // sqa .stackexchange.com / Questions / 22534 / Pourquoi-drag-and-goutte-is-pas-working-in-selenium-webdiver / 26500 (aucune réponse acceptée, mais quelques obstacles sur un) P>
Je suppose que c'est-à-dire que c'est-à-dire que le conducteur est simplement flaky, et faire glisser-déposer peut travailler sur certains sites Web, mais pas d'autres, pour des raisons inconnues. Vous aurez peut-être une meilleure chance d'ouvrir un problème GitHub dans le référentiel de Sélénium et de fournir un échantillon / URL de code de travail où la traînée et la chute ne fonctionnent absolument pas, tout le temps. P>
Vous avez mentionné ... IE Driver est juste flaky ... I> sans aucune preuve. C'est assez injustifié. Pour l'enregistrement, si vous faites glisser et déposer des œuvres avec d'autres navigateurs, cela fonctionnerait également avec IE.
J'ai mentionné que c'était une supposition, et c'est basé sur de multiples rapports de Drag & Drop travaillant avec succès sur Chrome / Firefox, mais pas c'est-à-dire que certaines de ces questions remontant à 2015, 2016 et de nombreux rapports sont les mêmes, la plupart n'ont pas de résolution. quoi que ce soit. La langue de ma réponse ne suggère pas ce que je dis est Canon, c'est juste une supposition basée sur une observation répétée en plus de mes problèmes personnels avec IE Driver.
glisser-déposer est problématique maintenant avec sélénium. Ici, une simulation de glisser-déposer est décrite: Comment Simulez HTML5 glisser-déposer dans le webDriver Selenium? P>
Ce problème est spécifique à html5 glisser-déposer le problème i>. JS basé sur la traînée et la chute fonctionnent toujours.
@Frank - Merci pour vos intrants. S'il vous plaît voir mon message ci-dessous. J'ai déjà essayé toutes les solutions JavaScript publiées sur différents threads, mais aucun d'entre eux ne fonctionne. S'il vous plaît examiner le code et laissez-moi savoir si je manque quelque chose.
J'ai essayé avec la réponse dans ce fil: Impossible de Automatiser glisser-déposer pour IE11: sélénium WebDriver (qui a également évoqué par Christine). Il peut bien fonctionner dans IE11 avec la page de test du code et du Page de glisser-déposer de W3schools . Il vous suffit de remplacer l'URL du site de votre propriétaire et les deux pièces d'identité des éléments avec votre possède dans le code. ----------------------- -----------------------------------------Éditer-------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---- p> Le site que vous avez fourni est sur le drag & drop jQuery. Il est différent de drag & drop HTML5. Par ailleurs, les éléments de drag & drop est dans un iframe strong>. Nous devons utiliser Switchto () code> pour atteindre l'iframe au début. Vous pouvez vérifier le code ci-dessous, il peut fonctionner bien dans IE: P>
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
public class IEauto {
public static void main(String[] args) {
//add the IE web driver path here..
System.setProperty("webdriver.ie.driver","C:\\yourpath\\IEDriverServer_x64_3.14.0\\IEDriverServer.exe");
WebDriver driver = new InternetExplorerDriver();
//replace the URL of the web page here..
driver.get("https://jqueryui.com/droppable/");
//int size = driver.findElements(By.tagName("iframe")).size();
driver.switchTo().frame(0);
WebElement ele_source = driver.findElement(By.id("draggable"));
WebElement ele_target = driver.findElement(By.id("droppable"));
Actions builder = new Actions(driver);
builder.dragAndDrop(ele_source, ele_target).build().perform();
}
}
Merci pour vos intrants. S'il vous plaît voir mon message ci-dessous. J'ai déjà essayé toutes les solutions JavaScript publiées sur différents threads, mais aucun d'entre eux ne fonctionne. S'il vous plaît examiner le code et laissez-moi savoir si je manque quelque chose.
Sur le site Web de votre code, vous êtes simulant JQuery Drag and Drop, il est différent de HTML5 Drag and Drop. Vous pouvez également faire référence à ce fil pour des solutions de simulation de la traînée de jQuery et tomber.
@CHandreshParmar j'ai mis à jour ma réponse. Veuillez vérifier mon code d'échantillon, cela peut bien fonctionner dans IE 11.
J'ai également fait face au même problème. Veuillez trouver ci-dessous la fonction de script Java personnalisée pour glisser-déposer.
1) Créez le fichier dragdrop.js et coller ci-dessous Code de celui-ci P> 2) en utilisant ci-dessous le code que nous Peut appeler au-dessus de la fonction personnalisée (ci-dessous est C # Code) P> string script = System.IO.File.ReadAllText(@"{filepath of DragDrop.js file}");
script = script + "executeDrageAndDrop(arguments[0], arguments[1])";
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
IWebElement source = driver.findElement(By......);
IWebElement target = driver.findElement(By......);
executor.ExecuteScript(script, source, target);