Selenium:从文件系统拖放到webdriver?

我必须测试一个Web应用程序,其中包含一个拖放区域,用于从本地文件系统上载文件。 我的测试环境基于C#。

对于我使用过Selenium的自动化测试,但是无法从文件系统中拖动文件。 上传区域是div标签(无input标签)。 那么最好的方法是什么? AutoIt(可以放入网络浏览器)吗? Sikuli?

单独使用Selenium是可能的,但这并不简单。 它需要在页面中注入一个新的INPUT元素,以通过SendKeys接收文件。 然后,脚本需要通过将dragenterdragoverdrop事件发送到目标区域来模拟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

之前的答案是正确的,并且与Chrome驱动程序完美配合,但是可能会出现Mozilla Gecko驱动程序的问题,该驱动程序会抛出org.openqa.selenium.ElementNotVisibleException

为了避免这种情况,请删除input.style.display = 'none';

你可以使用input.style.opacity = 0; 如果你需要让它消失。