Я использовал 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, пожалуйста, взгляни