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

2024-05-12

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

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


单独使用 Selenium 是可能的,但这并不简单。需要注入新的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);
}

Source: https://gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e https://gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium:从文件系统拖放到 WebDriver? 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在Python和Selenium中通过标签名称或id获取元素[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 和 Selenium 获取输入 但它向我显示错误 我该如何解决这个错误 inputElement send keys getStock getStocklFunc 0 Error i
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • javax.faces.context.FacesContext.isReleased(FacesContext.java:609) 处的 java.lang.UnsupportedOperationException

    我正在集成 SWF 2 2 1 Primefaces 2 2 1 JSF 2 Spring Security 3 Spring 3 1 0M1 我能够访问 Spring web flow xml 中提到的第一页 但出现以下错误 com su
  • 类型错误:“NodeView”对象不支持项目分配 - NetworkX

    我正在完成本教程 https www datacamp com community tutorials networkx python graph tutorial https www datacamp com community tuto
  • python 中的按钮数组

    我想创建一个按钮网格 单击它们时将切换颜色 目前 每个按钮都会触发右下角的按钮 下面是代码 有两个问题 为什么会这样做以及如何纠正 def main self root Tk frame Frame root frame grid row
  • 如何在水晶报表的页眉中添加图表

    我尝试在水晶报表的页眉中添加图表 但它仅在报表页眉和报表页脚中添加 如何在页眉中添加图表 页眉或详细信息部分中不能有图表 图表仅在报告页眉或页脚中起作用 如果页眉中需要图表 请在页眉中创建子报表 并将图表放置在子报表中
  • maven-jar-plugin 不包含 .gitignore 文件

    我尝试使用maven将应用程序打包成jar文件 不知怎的 除了 gitignore文件被添加到 jar 中 为什么会跳过此文件以及如何禁用此文件 即使我尝试像下面这样包含它 包含也会被忽略 并且 jar 文件仍然为空
  • 如何在iOS社交框架中使用SLRequest获取facebook的电子邮件参数

    我尝试使用以下代码来获取登录 iOS 设置 Facebook 的人的电子邮件 请帮助我如何从 SLRequest 获取电子邮件 void getMyDetails if accountStore accountStore ACAccount
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 如何允许点击穿过 div 但仍然对悬停做出反应?

    说我有divA部分重叠的divB 我怎样才能允许点击divA穿过去divB但仍然有hover悬停时触发divA 我知道pointer events none 这使得点击通过 但也阻止了悬停 我也尝试过以下方法 但它不允许点击失败 docum
  • 如何中止 MongoDB shell 中正在运行的查询?

    我不敢相信我必须问这个问题 但是如何停止我刚刚运行的查询 该查询现在正在运行 并且显然需要很长时间才能在 Mongo shell 中完成 Control C似乎会使外壳崩溃 并吐出大量错误 中建议的愚蠢解决方案这个帖子 https stac
  • 在 VS 包项目中获取 dte2 或 TeamFoundationServerExt 对象?

    我正在开发一个 Visual Studio Package 项目 该项目需要连接到我们的 TFS 要读取当前连接 我需要 TeamFoundationServerExt 对象 我应该能够从 dte2 对象中获取该对象 现在我找到了数百个示例
  • swift 中带有字符的单引号

    我已经完成了 C C Java 这些语言告诉我字符用单引号括起来 主要是在遵守正确的语法时 但字符串是双引号的 Swift 的语法是否只允许字符位于单引号内 或者提供这种语法背后有一些有效的原因 逻辑 let char1 Character
  • 交换单链表中的节点

    我正在尝试交换两个节点 例如 如果节点是a and b我正在传递指针 a 1 gt next and b 1 gt next这基本上是节点a and b void swap struct stack a struct stack b str
  • 在 Cocoa/Carbon 下调试 NULL CGContext

    在执行程序期间 我在 XCode 调试控制台中得到以下输出
  • 当传递命名参数时,matplotlib 不会绘图

    有人可以解释这种行为吗 import matplotlib pyplot as plt plt plot x 0 05 0 1 0 15 y 102 211 393 plt show import matplotlib pyplot as
  • 作业 - Python 代理服务器

    对于编程练习 摘自 计算机网络 自上而下的方法 第 6 版 作者 Kurose 和 Ross 我们正在尝试用 python 开发一个简单的代理服务器 我们得到了以下代码 无论它在哪里 Fill in start Fill in end 这就
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • 如何在 MVVM 中使用应用程序命令

    我想使用 ApplicationCommands Cut 复制 粘贴 保存 它们看起来很有趣 因为命令路由 键绑定以及某些控件使用它们的事实 我了解如何绑定到虚拟机上的中继 委托命令 但我似乎无法理解应用程序命令 我找到了一些旧的答案 但没
  • 解锁设备后 Android Activity 重新启动

    我正在创建一个简单的 Android 项目 但是当用户解锁屏幕 锁定后 时 我的每个活动都会重新启动 这是 Android 应用程序的正常行为吗 或者我必须在清单中处理它 或者别的地方 请帮忙 如果您的目标构建版本是 Honeycomb 3
  • Plotly:如何更改子图 y 轴的范围?

    我有以下代码 from plotly subplots import make subplots import requests import json import datetime as dt import pandas as pd i
  • Selenium:从文件系统拖放到 WebDriver?

    我必须测试一个网络应用程序 其中包含一个用于从本地文件系统上传文件的拖放区域 我的测试环境是基于C 的 对于自动化测试 我使用了 Selenium 但无法从文件系统中拖动文件 上传区域是div标签 无input标签 那么最好的方法是什么 A