【问题标题】:Unable to Automate Drag and Drop for IE11 : Selenium WebDriver无法为 IE11 自动拖放:Selenium WebDriver
【发布时间】:2016-03-29 08:59:52
【问题描述】:

我正在尝试使用 Java 中的 Selenium Web 驱动程序在 IE11 中自动执行拖放功能。我可以在 Chrome 上以某种方式实现它,但它没有在 IE 中发生。

在进一步解释之前,我是如何拖放的:

Actions builder = new Actions(driver);
builder.clickAndHold(sourceElement)
 .moveToElement(targetElement)
 .release(targetElement)
 .build().perform();

在 IE 中:它不是拖放,而是选择从源元素到目标元素的所有文本。我认为这可能是因为它拾取了错误的元素并尝试了一些相关的父子元素的操作,但没有奏效。

在 Chrome 中:运行流畅。

在 Firefox 中:只需单击保持并在拖动时抛出,element no longer attached to DOM exception。这可能是因为,我正在从网格(剑道网格)中拖动一行,并且由于无法从网格中拖动一行,我们的开发人员已经以这样一种方式实现了它,即当您拖动一行时,会创建一个新的动态元素移动。

只是补充更多细节:

  1. 我已经尝试过dragAndDrop() 和其他Javacript 选项。
  2. 我正在使用最新版本的 selenium 和更新的 IE。
  3. 我们的网格使用 HTML5 组件,我发现已经存在一些问题(虽然不确定所有问题是什么),但由于我的方案在一个浏览器中运行,我希望这不是这些问题之一。
  4. 我以某种方式使用Robot 类使其成为可能,但它太不可靠并且行为怪异,我宁愿放弃也不愿使用它。

任何帮助将不胜感激!

【问题讨论】:

  • 我面临同样的问题。您找到解决方案了吗?你能告诉我你是如何使用机器人类让它工作的吗?

标签: java selenium selenium-webdriver


【解决方案1】:

如果是 HTML5 拖放,一个解决方案是使用一些 javascript 来模拟它。 这是一个将物品放入垃圾箱的工作示例:

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

WebDriver driver = new InternetExplorerDriver();
driver.get("http://html5demos.com/drag");

WebElement ele_source = driver.findElement(By.id("two"));
WebElement ele_target = driver.findElement(By.id("bin"));

// drag and drop item two into the bin
((JavascriptExecutor)driver).executeScript(JS_DnD, ele_source, ele_target);

【讨论】:

  • 您好 Florent,感谢您的回答。如前所述,我已经尝试过 javascript 选项。同样的问题,适用于我的应用程序的 chrome,但不适用于 IE。
  • 此示例适用于 IE11,因此您的 DnD 实现可能不兼容 HTML5。在这里找到解决方案的最佳方法是分析页面。
  • 我没有说你的例子不起作用。该示例适用于您所指的网站,但不适用于我的应用程序。问题是别的。这里的区别是在拖动时会创建一个新元素(如问题中所述)。我在问题中添加的细节不是基于假设,我在发布问题之前已经确认了相关细节。没关系,感谢您花时间帮助我,如果您认为我可能遗漏了什么,请告诉我。
  • 您是否尝试在创建新元素后发送 drop 事件?
  • 如果没有可重现的例子就做不到。你可以在 Fiddle 上创建一个吗?
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2023-03-03
  • 2014-07-23
  • 2023-03-17
  • 2012-08-04
相关资源
最近更新 更多