Javascript Selenium WebDriver-无法在IE11中拖放元素
我正在尝试将一个元素从侧面板拖放到窗体。我写的拖放代码如下所示Javascript Selenium WebDriver-无法在IE11中拖放元素,javascript,selenium,selenium-webdriver,internet-explorer-11,Javascript,Selenium,Selenium Webdriver,Internet Explorer 11,我正在尝试将一个元素从侧面板拖放到窗体。我写的拖放代码如下所示 Actions builder = new Actions(driver); builder.dragAndDrop(source, target).build().perform(); 这在除IE11之外的所有浏览器中都可以正常工作 我尝试了其他方法,比如 方法1- builder.clickAndHold(source) .moveToElement(target) .release(targe
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();
但什么都不管用
最重要的是,所有选项在页面上都不起任何作用,但执行时不会出现任何错误。我还尝试了在不同的stackoverflow/gitHub链接中提供的所有javascript解决方案,但没有任何效果
有人能帮我吗
编辑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_和drop_helper.js
我有什么遗漏或做错的吗
谢谢,
Chandresh Parmar似乎是IE11的一个已知问题,没有人能够解决 Selenium存储库中打开了一个相关的GitHub问题,但由于缺少一个可重复使用的示例,该问题已被关闭: StackExchange上的其他用户自2016年以来一直看到这个问题,但没有真正的解决方案: (无工作决议) (没有被接受的答案,但有几票赞成)
我的猜测是IE驱动程序很脆弱,由于未知的原因,拖放可能在某些网站上有效,但在其他网站上无效。在Selenium存储库中打开GitHub问题可能会更幸运,并提供一个工作代码示例/URL,其中拖放始终无法工作。似乎是IE11的一个已知问题,没有人能够解决 Selenium存储库中打开了一个相关的GitHub问题,但由于缺少一个可重复使用的示例,该问题已被关闭: StackExchange上的其他用户自2016年以来一直看到这个问题,但没有真正的解决方案: (无工作决议) (没有被接受的答案,但有几票赞成)
我的猜测是IE驱动程序很脆弱,由于未知的原因,拖放可能在某些网站上有效,但在其他网站上无效。在Selenium存储库中打开GitHub问题可能会更幸运,并提供一个工作代码示例/URL,其中拖放始终不起作用。现在使用Selenium时,拖放是有问题的。这里描述了拖放模拟:现在使用Selenium时,拖放是有问题的。这里描述了一个拖放的模拟:我尝试了这个线程中的答案:(Christine也提到了)。在IE11中,它可以很好地工作,代码中的测试页面和。您只需要在代码中用您的所有者替换您所有者的网站url和两个元素的ID ----------------------------------------------------------------编辑-------------------------------------------------------------- 您提供的网站是关于jQuery拖放的。它不同于HTML5拖放。此外,拖放元素在iframe中。我们首先需要使用
switchTo()
到达iframe。您可以检查以下代码,它可以在IE中正常工作:
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();
}
}
结果如下:
我试着在这条帖子中找到答案:(Christine也提到过)。在IE11中,它可以很好地工作,代码中的测试页面和。您只需要在代码中用您的所有者替换您所有者的网站url和两个元素的ID ----------------------------------------------------------------编辑-------------------------------------------------------------- 您提供的网站是关于jQuery拖放的。它不同于HTML5拖放。此外,拖放元素在iframe中。我们首先需要使用
switchTo()
到达iframe。您可以检查以下代码,它可以在IE中正常工作:
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();
}
}
结果如下:
我也面临同样的问题。请在下面找到用于拖放的自定义java脚本函数 1) 创建DragDrop.js文件并将下面的代码粘贴到其中
function customEvent(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 executeDrageAndDrop(element, target) {
var dragStartEvent = customEvent('dragstart');
dispatchEvent(element, dragStartEvent);
var dropEvent = customEvent('drop');
dispatchEvent(target, dropEvent, dragStartEvent.dataTransfer);
var dragEndEvent = customEvent('dragend');
dispatchEvent(element, dragEndEvent, dropEvent.dataTransfer);
}
2) 使用下面的代码,我们可以调用上面的自定义函数(下面是C代码)
注意:对于Java-将上面的C#代码转换为Java并尝试一下。我已经尝试过上面的代码,它适用于IE、Edge和Chrome浏览器。我也遇到过同样的问题。请在下面找到用于拖放的自定义java脚本函数 1) 创建DragDrop.js文件并将下面的代码粘贴到其中
function customEvent(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 executeDrageAndDrop(element, target) {
var dragStartEvent = customEvent('dragstart');
dispatchEvent(element, dragStartEvent);
var dropEvent = customEvent('drop');
dispatchEvent(target, dropEvent, dragStartEvent.dataTransfer);
var dragEndEvent = customEvent('dragend');
dispatchEvent(element, dragEndEvent, dropEvent.dataTransfer);
}
2) 使用下面的代码,我们可以调用上面的自定义函数(下面是C代码)
注意:对于Java-将上面的C#代码转换为Java并尝试一下。我已经试过上面的代码,它适用于IE、Edge和Chrome浏览器。你提到过……IE驱动程序很脆弱。。。没有任何证据。这是很不合理的。记录在案,如果拖放可以与其他浏览器协同工作,那么它也可以与IE协同工作。我提到这是一个猜测,这是基于多个关于拖放在Chrome/Firefox上成功工作的报告,而不是IE——其中一些问题可以追溯到2015年、2016年,许多报告都是相同的,大多数都没有任何解决方案。我回答的语言并不表明我所说的是佳能,这只是一个基于反复观察的猜测,加上我与IE driver的个人问题。你提到过…IE driver只是个古怪的人。。。没有任何证据。这是很不合理的。记录在案,如果拖放可以与其他浏览器协同工作,那么它也可以与IE协同工作。我提到这是一个猜测,这是基于多个关于拖放在Chrome/Firefox上成功工作的报告,而不是IE——其中一些问题可以追溯到2015年、2016年,许多报告都是相同的,大多数都没有任何解决方案。我回答的语言并不暗示