Перетащите файл в браузер, используя селен Java не работает - PullRequest
0 голосов
/ 09 января 2019

Я использовал javascript, упомянутый в этой статье. Selenium: перетаскивание из файловой системы в вебдрайвер?

Использование Java с селеном.

Код отправляет любую ошибку, но файл не сбрасывается. В перетаскиваемой области я вижу на экране действия перетаскивания, но не вижу файлов, сброшенных в пользовательском интерфейсе.

Фрагмент: -

public void dropFile(WebElement target, int offsetX, int offsetY) {
        String workingDir = System.getProperty("user.dir");
        String filepath = workingDir + "\\Testdata.txt";
    //    JavascriptExecutor jse = (JavascriptExecutor) driver;

        String JS_DROP_FILE = "var args = arguments,"+
                "element = args[0],"+
                "offsetX = args[1],"+
                "offsetY = args[2],"+
                "doc = element.ownerDocument || document;"+

              "for (var i = 0; ;) {"+
                "var box = element.getBoundingClientRect(),"+
                  "clientX = box.left + (offsetX || (box.width / 2)),"+
                  "clientY = box.top + (offsetY || (box.height / 2)),"+
                  "target = doc.elementFromPoint(clientX, clientY);"+

                "if (target && element.contains(target))"+
                    "break;"+

                "if (++i > 1) {"+
                  "var ex = new Error('Element not interactable');"+
                  "ex.code = 15;"+
                  "throw ex;"+
                "}"+

                "element.scrollIntoView({behavior: 'instant', block: 'center', inline: 'center'});"+
              "}"+

              "var input = doc.createElement('INPUT');"+
              "input.setAttribute('type', 'file');"+
              "input.setAttribute('multiple', '');"+
              "input.setAttribute('draggable','true');"+
              "input.setAttribute('style', 'position:fixed;z-index:2147483647;left:0;top:0;');"+
               "input.onchange = function (ev) {"+
                "input.parentElement.removeChild(input);"+
                "ev.stopPropagation();"+

                "var dataTransfer = {"+
                  "constructor   : DataTransfer,"+
                  "effectAllowed : 'all',"+
                  "dropEffect    : 'none',"+
                  "types         : [ 'Files' ],"+
                  "files         : input.files,"+
                  "setData       : function setData(){},"+
                  "getData       : function getData(){},"+
                  "clearData     : function clearData(){},"+
                 " setDragImage  : function setDragImage(){}"+
                "};"+
                 "input.ondrop = function dropHandler(ev) {"+
                 "console.log('File(s) dropped');"+
                 // Prevent default behavior (Prevent file from being opened)
                 "ev.preventDefault();"+
                 "if (ev.dataTransfer.items) {"+
    // Use DataTransferItemList interface to access the file(s)
                "for (var i = 0; i < ev.dataTransfer.items.length; i++) {"+
      // If dropped items aren't files, reject them
              "if (ev.dataTransfer.items[i].kind === 'file') {"+
              "var file = ev.dataTransfer.items[i].getAsFile();"+
              "console.log('... file[' + i + '].name = ' + file.name);"+
      "}"+
    "}"+
  "} else {"+
    // Use DataTransfer interface to access the file(s)
    "for (var i = 0; i < ev.dataTransfer.files.length; i++) {"+
      "console.log('... file[' + i + '].name = ' + ev.dataTransfer.files[i].name);"+
    "}"+
  "}"+ 
  // Pass event to removeDragData for cleanup
 "removeDragData(ev)"+
    "};"+
    "function removeDragData(ev) {"+
     "console.log('Removing drag data');"+
     "if (ev.dataTransfer.items) {"+
       // Use DataTransferItemList interface to remove the drag data
       "ev.dataTransfer.items.clear();"+
     "} else {"+
       // Use DataTransfer interface to remove the drag data
       "ev.dataTransfer.clearData();"+
     "}"+
   "}"+

                "if (window.DataTransferItemList) {"+
                  "dataTransfer.items = Object.setPrototypeOf(Array.prototype.map.call(input.files, function(file) {"+
                    "return {"+
                      "constructor : DataTransferItem,"+
                      "kind        : 'file',"+
                      "type        : file.type,"+
                      "getAsFile   : function getAsFile () { return file },"+
                      "getAsString : function getAsString (callback) {"+
                        "var reader = new FileReader();"+
                        "reader.onload = function(ev) { callback(ev.target.result) };"+
                        "reader.readAsText(file);"+
                     " }"+
                    "}"+
                  "}), {"+
                    "constructor : DataTransferItemList,"+
                    "add    : function add(){},"+
                    "clear  : function clear(){},"+
                    "remove : function remove(){}"+
                 " });"+
                "}"+
                "['dragenter','dragover', 'drop', 'dragleave'].forEach(function (type) {"+
                  "var event = doc.createEvent('CustomEvent');"+
                  "event.initCustomEvent(type, true, true, doc.defaultView, 0, 0, 0, clientX, clientY, false, false, false, false, 0, null);"+
                  "Object.setPrototypeOf(event, null);"+
                  "event.dataTransfer = dataTransfer;"+
                  "Object.setPrototypeOf(event, DragEvent.prototype);"+
                  "target.dispatchEvent(event);"+
               " });"+
              "};"+
              "doc.documentElement.appendChild(input);"+
            "input.getBoundingClientRect();"+ /* force reflow for Firefox */
              "return input;";
        WebElement input = (WebElement)driverUtil.ngDriver.evaluateScript(target, JS_DROP_FILE);
       // WebElement input = (WebElement)((JavascriptExecutor) driver).executeScript(JS_DROP_FILE, target, offsetX, offsetY);
        input.sendKeys(filepath);
    }

droparea - это элемент div, на который мне нужно сбросить файл.

Пожалуйста, помогите мне выяснить, пропустил ли я какой-либо шаг или сделал что-то не так здесь. @FlorentB, пожалуйста, взгляни

1 Ответ

0 голосов
/ 09 января 2019

Вы пробовали перетаскивать селен action ?

Вероятно, это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...