当前位置: 首页 > 面试题库 >

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

壤驷涛
2023-03-14
问题内容

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

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


问题答案:

单独使用硒是可能的,但这并不简单。它需要INPUT在页面中注入新元素以通过接收文件SendKeys。然后,脚本需要通过发送模拟下降dragenterdragoverdrop事件到目标区域。

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



 类似资料:
  • 在过去的5天里,我一直在寻找拖放的有效解决方案。所以, Selenium. WebDriver 2.44.0 网络驱动程序。ChromeDriver。win32 2.13.0.0 Chrome最新版本。 C#,页面对象模式。抱歉屏幕上出现俄文描述:) 我们有. net cms。它有页面编辑器。编辑器在父页面中打开,如果从同一域加载到iframe中,则要编辑的页面。 我需要拖动'n'放置项目(图片,

  • 问题内容: 如今,我们可以将文件拖放到一个特殊的容器中,并使用XHR2上载它们。带有实时进度条等。非常酷的东西。 但是有时候我们不想要那么酷。我想要的是一次将文件拖放 到标准HTML文件输入中 :。 那可能吗?有什么方法可以从文件拖放中用正确的文件名(?)“填充”文件输入吗?(出于文件系统安全性原因,完整的文件路径不可用。) 为什么? 因为我想提交一份普通表格。适用于所有浏览器和所有设备。拖放只是

  • 问题内容: 有人可以告诉我我在做什么错吗?我可以使用常规面板进行拖放操作,但现在尝试使用表格,无法对其进行整理。我对Points和DropTargets感到困惑。不要介意“添加”按钮。我觉得我需要首先处理DnD。 问题答案: 我个人会放弃滚动窗格上的放置目标,这将导致您遇到许多问题。 您的放置方法有点怪异… 这是一个坏主意.... 基本上,您尝试从可转移文件中提取文件列表,并且不管操作成功与否,您

  • 问题内容: 我无法使用Python WebDriver绑定进行拖放。我正在Mac OS X上使用Google Chrome和Firefox。这里有一个线程,那里有人遇到类似问题。 我尝试使用: 您是否设法使Python WebDriver拖放工作? 问题答案: 为了给出更新的答案,我已经验证了它现在确实可以在Mac上运行。 参考

  • 我试图执行拖放操作使用selenium网络驱动程序和红宝石,我尝试了以下选项: 选项1:基于http://rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Element#drag_and_drop_on-实例法 备选案文2: 备选案文3: 当我或代码能够单击对象,即它能够找到元素,但由于某种原因不能拖放。以上拖放选项都不

  • 我已经在Ubuntu 14.04上安装了hadoop。每当我将文件从本地文件系统复制到HDFS时,我都会出现以下错误。 我使用这个命令: 我遇到的错误是: 我是Linux环境的新手。我不明白哪个文件不存在。