Selenium WebDriver-无法在IE11中拖放元素 [英] Selenium WebDriver - Unable to drag and drop element in IE11

查看:89
本文介绍了Selenium WebDriver-无法在IE11中拖放元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从侧面板拖放元素以形成表单.拖放代码如下所示.

I am trying to drag and drop an element from side panel to form. Drag and drop code what I wrote is like below.

Actions builder = new Actions(driver);
builder.dragAndDrop(source, target).build().perform();

这在除IE11之外的所有浏览器中均能正常工作.

This works fine in all browser except IE11.

我尝试了其他方法,例如

I tried other approaches like

方法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解决方案,但没有任何效果.

Above all options do nothing on the page but they are getting executed without any error. I have also tried all the javascript solutions given in different stackoverflow/gitHub links but nothing is working.

有人可以帮我吗?

编辑1-

正如我前面提到的,我已经尝试了所有可能的/提到的解决方案,但是没有一个起作用.这是我的代码.

As I mentioned earlier, I have tried all the possible/mentioned solutions but none of there are working. Here is my code.

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

我已经尝试了以下功能,一个又一个地取消注释并执行,但是所有功能都成功执行,并且页面上没有任何内容.

I have tried below function one by one uncommenting and executing but all of them gets executed successfully and nothing happens on page.

注意:我从 https://gist.github.com/rcorreia/2362544获得了drag_and_drop_helper.js.

在这里我有什么想念的吗?

Is there anything I am missing or doing wrong here?

谢谢,Chandresh Parmar

Thanks, Chandresh Parmar

推荐答案

似乎是IE11的一个已知问题,没有人能够解决.

Seems like a known issue with IE11 that no one has been able to fix.

在Selenium存储库中存在一个相关的GitHub问题,但由于缺少可复制的示例而被关闭:

There's a relevant GitHub issue opened in the Selenium repository, but it's been closed due to lack of a working, reproducible example:

https://github.com/SeleniumHQ/selenium/issues/6354

StackExchange上的其他用户自2016年以来一直遇到此问题,但没有实际解决方案:

Other users on StackExchange have been seeing this problem since 2016, with no real resolution:

无法自动执行IE11的拖放操作:Selenium WebDriver (无工作分辨率)

https://sqa.stackexchange.com/questions/22534/why-drag-and-drop-is-not-working-in-selenium-webdriver/26500 (未接受答案,但有几个建议)

https://sqa.stackexchange.com/questions/22534/why-drag-and-drop-is-not-working-in-selenium-webdriver/26500 (no accepted answer, but a few upvotes on one)

我的猜测是IE驱动程序很不稳定,并且出于未知原因,拖放可能在某些网站上有效,而在其他网站上则无效.您可能会比较幸运,可以在Selenium存储库中打开GitHub问题,并提供一个工作代码示例/URL,始终无法进行拖放操作.

My guess is IE driver is just flaky, and drag and drop may work on some websites, but not others, for unknown reasons. You may have better luck opening a GitHub issue in the Selenium repository, and provide a working code sample / URL where drag and drop is absolutely not working, all of the time.

这篇关于Selenium WebDriver-无法在IE11中拖放元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆