Selenium: перетаскивание из файловой системы в WebDriver?

Я должен протестировать веб-приложение, которое содержит область перетаскивания для загрузки файлов из локальной файловой системы. Моя тестовая среда основана на C #.

Для тестирования автоматизации я использовал Selenium, но перетаскивать файлы из файловой системы не представляется возможным. Область загрузкиdiv тег (нетinput тег). Так каков лучший способ сделать это? AutoIt (возможно ли заскочить в веб-браузер)? Sikuli?

 fiat12 окт. 2017 г., 06:54
По какой-то причине ответ Флорента Б не сработал - AutoIt добился целиstackoverflow.com/a/38513989/1141876

Ответы на вопрос(2)

однако могут возникнуть проблемы с драйвером Mozilla Gecko, который выдаетorg.openqa.selenium.ElementNotVisibleException

Чтобы избежать этого, удалитеinput.style.display = 'none';

Ты можешь использоватьinput.style.opacity = 0; если вам нужно, чтобы он исчез.

Решение Вопроса

но это не просто. Требуется ввести новыйINPUT элемент на странице, чтобы получить файл черезSendKeys, Затем сценарий должен имитировать падение, отправивdragenter, dragover, drop события в целевой области.

static void Main(string[] args)
{
    var driver = new ChromeDriver();
    driver.Url = "https://react-dropzone.js.org/";

    IWebElement droparea = driver.FindElementByCssSelector("[data-preview='Basic example'] [style]");
    DropFile(droparea, @"C:\Users\florent\Desktop\capture.png");

    driver.Quit();
}

const string JS_DROP_FILE = "for(var b=arguments[0],k=arguments[1],l=arguments[2],c=b.ownerDocument,m=0;;){var e=b.getBoundingClientRect(),g=e.left+(k||e.width/2),h=e.top+(l||e.height/2),f=c.elementFromPoint(g,h);if(f&&b.contains(f))break;if(1<++m)throw b=Error('Element not interractable'),b.code=15,b;b.scrollIntoView({behavior:'instant',block:'center',inline:'center'})}var a=c.createElement('INPUT');a.setAttribute('type','file');a.setAttribute('style','position:fixed;z-index:2147483647;left:0;top:0;');a.onchange=function(){var b={effectAllowed:'all',dropEffect:'none',types:['Files'],files:this.files,setData:function(){},getData:function(){},clearData:function(){},setDragImage:function(){}};window.DataTransferItemList&&(b.items=Object.setPrototypeOf([Object.setPrototypeOf({kind:'file',type:this.files[0].type,file:this.files[0],getAsFile:function(){return this.file},getAsString:function(b){var a=new FileReader;a.onload=function(a){b(a.target.result)};a.readAsText(this.file)}},DataTransferItem.prototype)],DataTransferItemList.prototype));Object.setPrototypeOf(b,DataTransfer.prototype);['dragenter','dragover','drop'].forEach(function(a){var d=c.createEvent('DragEvent');d.initMouseEvent(a,!0,!0,c.defaultView,0,0,0,g,h,!1,!1,!1,!1,0,null);Object.setPrototypeOf(d,null);d.dataTransfer=b;Object.setPrototypeOf(d,DragEvent.prototype);f.dispatchEvent(d)});a.parentElement.removeChild(a)};c.documentElement.appendChild(a);a.getBoundingClientRect();return a;";

static void DropFile(IWebElement target, string filePath, double offsetX = 0, double offsetY = 0)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException(filePath);

    IWebDriver driver = ((RemoteWebElement)target).WrappedDriver;
    IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;

    IWebElement input = (IWebElement)jse.ExecuteScript(JS_DROP_FILE, target, offsetX, offsetY);
    input.SendKeys(filePath);
}

Источник:https://gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e

 Florent B.11 апр. 2018 г., 21:52
@ Alex.K, трудно сказать, почему простое «не работает», так как страница может справиться с отбрасыванием разными способами. Обратите внимание, что он больше не должен работать с Firefox, так как ввод должен быть сложным. Вы должны опубликовать вопрос с вашей проблемой.
 Alex.K.13 апр. 2018 г., 14:08
@FlorentB. Я испробовал ваш новый код для "Reaction-dropzone.js.org", и я не вижу, этот файл указан в "Dropped files". Я сделал это вручную, и тогда я вижу, что мой файл указан в списке «Удаленные файлы». Теперь у меня нет ошибок JavaScript, но это не сработало (перетаскивание по Selenium). Есть идеи?
 Alex.K.11 апр. 2018 г., 22:11
@Florent B. Я попробую завтра и предоставлю обратную связь. Что касается деталей, я использую Google Chrome.
 Youssof H.30 авг. 2019 г., 17:57
@FlorentB. Я использовал вашGitHub Project но, кажется, показывает мнеtracebacks Я использую Mac, если бы вы могли мне помочь.
 Florent B.11 апр. 2018 г., 21:55
@ Alex.K, попробуйте эту версию:gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e
 Florent B.12 апр. 2018 г., 18:32
@ Alex.K., Не могу сказать без воспроизводимого примера. Я увижу позже, чтобы обновить код с последним API для dataTransfer. Возможно, вы не выбрали правильный элемент с ожидаемым смещением.
 Alex.K.12 апр. 2018 г., 18:19
@FlorentB. Я удалил фигурные скобки для 'arget.getBoundingClientRect ()' и получил следующее сообщение об ошибке при следующем запуске: System.InvalidOperationException: 'unknown error: Невозможно прочитать свойство' left 'из undefined. в этой строке он жалуется: "cx = rect.left + (offsetX || (rect.width >> 1)),". Есть идеи?
 Alex.K.11 апр. 2018 г., 21:40
Не могли бы вы объяснить, что происходит в коде JavaScript? Правильно ли, что вы добавляете ввод, устанавливаете этот путь ввода в файл, затем запускаете / эмулируете события «dragenter», «dragover», «drop»? Что должно произойти в конце? Я пробовал этот код, и он не работал для меня. Я вижу, что ввод был введен на странице, и значение ввода содержит путь к файлу, но ничего не происходит с областью удаления.
 Alex.K.12 апр. 2018 г., 18:13
@FlorentB. Я пробовал код из "drop-files.js" и получаю следующую ошибку: System.InvalidOperationException: 'неизвестная ошибка: target.getBoundingClientRect не является функцией

Ваш ответ на вопрос