Saltar al contenido

Selenium: ¿arrastrar y soltar del sistema de archivos a WebDriver?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *