Este team de trabajo ha estado mucho tiempo buscando para dar soluciones a tus interrogantes, te dejamos la resolución y nuestro deseo es servirte de gran ayuda.
Solución:
Es posible solo con Selenium, pero no es simple. Requiere inyectar un nuevo INPUT
elemento en la página para recibir el archivo a través de SendKeys
. Luego, el script necesita simular la caída enviando el dragenter
, dragover
, drop
eventos al área objetivo.
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:UsersflorentDesktopcapture.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 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);
Fuente: https://gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e
La respuesta anterior es correcta y funciona perfectamente con el controlador Chrome, sin embargo, podría tener problemas con el controlador Mozilla Gecko, que lanza org.openqa.selenium.ElementNotVisibleException
Para evitarlo, elimine input.style.display = 'none';
Puedes usar input.style.opacity = 0;
si necesitas hacerlo desaparecer.
valoraciones y comentarios
Si para ti ha resultado provechoso este artículo, te agradeceríamos que lo compartas con más seniors de este modo contrubuyes a difundir este contenido.