Próbuję przeciągnąć i upuścić element z panelu bocznego do formy. Przeciągnij i upuść kod, co napisałem, jest jak poniżej.

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

Działa to dobrze we wszystkich przeglądarkach z wyjątkiem IE11.

Próbowałem innych podejść, takich jak

Podejście 1 -

builder.clickAndHold(source)
        .moveToElement(target)
        .release(target)
        .build()
        .perform();

Podejście 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();

Ale nic nie działa.

Przede wszystkim opcje nic nie robią na stronie, ale są wykonywane bez żadnego błędu. Wypróbowałem również wszystkie rozwiązania javascript podane w różnych linkach stackoverflow / gitHub, ale nic nie działa.

Czy ktokolwiek może mi z tym pomóc?

Edytuj 1–

Jak wspomniałem wcześniej, wypróbowałem wszystkie możliwe / wymienione rozwiązania, ale żadne z nich nie działa. Oto mój kod.

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

Próbowałem poniżej funkcji odkomentować i wykonać jeden po drugim, ale wszystkie z nich są wykonywane pomyślnie i nic się nie dzieje na stronie.

Uwaga : mam drag_and_drop_helper.js z https://gist.github.com/rcorreia/2362544.

Czy jest coś, czego tu brakuje lub robię źle?

Dzięki, Chandresh Parmar

0
Chandresh Parmar 20 listopad 2019, 20:22

4 odpowiedzi

Wygląda na znany problem z IE11, którego nikt nie był w stanie naprawić.

W repozytorium Selenium otwarto odpowiedni problem z GitHub, ale został on zamknięty z powodu braku działającego, odtwarzalnego przykładu:

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

Inni użytkownicy StackExchange widzieli ten problem od 2016 roku, bez rzeczywistego rozwiązania:

Nie można zautomatyzować przeciągania i upuszczania w IE11 : Selenium WebDriver< /a> (brak rozdzielczości roboczej)

https://sqa.stackexchange. com/questions/22534/why-drag-and-drop-is-not-working-in-selenium-webdriver/26500 (brak zaakceptowanej odpowiedzi, ale kilka głosów za jednym)

Domyślam się, że sterownik IE jest po prostu niestabilny, a przeciąganie i upuszczanie może działać na niektórych stronach internetowych, ale nie na innych, z nieznanych powodów. Możesz mieć więcej szczęścia przy otwieraniu problemu z GitHub w repozytorium Selenium i dostarczaniu działającego kodu / adresu URL, gdzie przeciąganie i upuszczanie absolutnie nie działa przez cały czas.

2
CEH 20 listopad 2019, 21:55
Wspomniałeś, że ...sterownik IE jest po prostu niestabilny... bez żadnego dowodu. To całkiem nieuzasadnione. Dla przypomnienia, jeśli przeciąganie i upuszczanie działa z innymi przeglądarkami, działałoby również z IE.
 – 
DebanjanB
20 listopad 2019, 23:21
1
Wspomniałem, że to przypuszczenie, które opiera się na wielu raportach o pomyślnym działaniu przeciągania i upuszczania w Chrome/Firefox, ale nie w IE – niektóre z tych problemów pochodzą z 2015 i 2016 r., a wiele z nich jest takich samych, w większości brakuje rozwiązania. cokolwiek. Język mojej odpowiedzi nie sugeruje, że jest to kanon, to tylko domysły oparte na wielokrotnych obserwacjach i moich osobistych kłopotach ze sterownikiem IE.
 – 
CEH
20 listopad 2019, 23:30

Przeciąganie i upuszczanie jest teraz problematyczne w przypadku Selenium. Poniżej opisana jest symulacja przeciągania i upuszczania: Jak to zrobić symulować przeciąganie i upuszczanie HTML5 w Selenium Webdriver?

0
Frank 20 listopad 2019, 23:09
Ten problem dotyczy problemu z przeciąganiem i upuszczaniem HTML5. Przeciąganie i upuszczanie oparte na JS nadal działa.
 – 
DebanjanB
20 listopad 2019, 23:24
- Dzięki za twoje uwagi. Proszę zobaczyć mój post poniżej. Próbowałem już wszystkich rozwiązań javascript publikowanych w różnych wątkach, ale żadne z nich nie działa. Przejrzyj kod i daj mi znać, jeśli czegoś brakuje.
 – 
Chandresh Parmar
22 listopad 2019, 11:53

Próbowałem z odpowiedzią w tym wątku: Nie można zautomatyzować Przeciągnij i upuść dla IE11: Selenium WebDriver (o którym również wspomniała Christine). Może działać dobrze w IE11 ze stroną testową w kodzie i przeciągnij i upuść stronę w3schools< /a>. Wystarczy, że zamienisz adres URL swojej witryny i identyfikatory dwóch elementów na własne w kodzie.

-------------------------------------------------- --------------Edytować----------------------------------- ---------------------------

Podana witryna dotyczy metody przeciągania i upuszczania jQuery. Różni się od przeciągania i upuszczania HTML5. Poza tym elementy przeciągnij i upuść znajdują się w elemencie iframe . Najpierw musimy użyć switchTo(), aby dotrzeć do elementu iframe. Możesz sprawdzić poniższy kod, może dobrze działać w 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();
    } 
}

Wynik jest taki: tu wpisz opis obrazu

0
Yu Zhou 26 listopad 2019, 11:56
Dzięki za wkład. Zobacz mój post poniżej. Wypróbowałem już wszystkie rozwiązania javascript zamieszczone w różnych wątkach, ale żadne z nich nie działa. Przejrzyj kod i daj mi znać, jeśli czegoś brakuje.
 – 
Chandresh Parmar
22 listopad 2019, 11:53
Z witryny w kodzie symulujesz przeciąganie i upuszczanie jQuery, co różni się od przeciągania i upuszczania HTML5. Możesz również zapoznać się z tym wątkiem, aby znaleźć rozwiązania symulacji przeciągania jQuery i upuszczać.
 – 
Yu Zhou
22 listopad 2019, 12:55
Zaktualizowałem swoją odpowiedź. Proszę sprawdzić mój przykładowy kod, może działać dobrze w IE 11.
 – 
Yu Zhou
26 listopad 2019, 11:58

Zmierzyłem się również z tym samym problemem. Poniżej znajduje się niestandardowa funkcja skryptu java do przeciągania i upuszczania.

1) Utwórz plik DragDrop.js i wklej do niego poniższy kod

    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) Używając poniższego kodu, możemy wywołać powyższą funkcję niestandardową (poniżej znajduje się kod C#)

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

Uwaga: w przypadku języka Java — przekonwertuj powyższy kod C# na język Java i wypróbuj go. Wypróbowałem powyższy kod i działa on w przeglądarkach IE, Edge i Chrome.

0
atul parate 4 grudzień 2019, 07:02