Selenium FindElement 会阻塞,直到文件上传完成

2024-01-05

短篇:

当我使用 SendKeys(path) 触发文件上传到代理元素(由 ExecuteScript 放置),然后通过 jquery.fileupload 插件代理到我的隐藏元素时,文件上传正常,但是当我尝试发出FindElement,它会阻塞直到服务器响应。

长:

我正在使用 2.4 C# Web 驱动程序、默认的 firefox 驱动程序和 jquery 文件上传插件 (blue imp)。

该流程首先单击一个按钮打开一个“概述对话框”,其中有我的

<input id="fileUpload" type="file" name="files[]" accept="video/quicktime,video/x-ms-wmv">
<lablel for="fileUpload">Select a file</label>

组成对话框后,我有

jquery('#fileUpload').fileupload(self.fileUploadOptions);

正常用法是用户单击标签,这会触发输入,然后触发并添加回调,检查大小/类型,如果确定,则更改为“进度”对话框,并执行data.submit().

进度会持续进行,直到得到响应,此时最终的对话框会显示一些结果,并且可以使用另一个按钮将其关闭。

所以,简而言之:

  1. 打开一个对话框
  2. 将对话框中的模板设置为简介
  3. 选择一个文件
  4. 更改对话框中的模板以进行操作
  5. 启动 ajax(或 iframe)上传
  6. 更改对话框中的模板以完成

Selenium 无法访问 fileUpload 输入(隐藏),因此为了让 Selenium 触发文件上传,我最终不得不执行一些如下脚本:

  1. 添加新的输入元素:

    jQuery('', {id: 'tmpId', type: 'file', name:'files[]'}).appendTo('modalDivId')

  2. 触发回调:

    $('#tmpId').bind('change', function (e) { $('#fileUpload').fileupload('add', { 文件:e.target.files || [{name: this.value}], 文件输入:$(这个) }); });

因此,现在创建 tmpId 输入元素后,我的 selenium 脚本将执行以下操作:

var path="\path\to\files";
var tmpInput = WebDriver.FindElement(By.Id("tmpId));
tmpInput.SendKeys(path);

这会触发添加回调,检查文件,将模板更改为“进度”,然后开始上传。 假设上传需要 60 秒,服务器将响应,然后模板将触发“完成”

问题是,虽然:

tmpInput.SendKeys(path);

返回“立即”,所以我打电话

var a = WebDriver.FindElement(By.Id("tmpId"));

并且此操作会一直阻塞,直到文件上传完成(60 秒)。即使进度条正在更新。

然后返回成功。

因为我有这个进度模板想要验证,所以我真的很想在上传过程中访问 DOM。

有什么想法吗?


表格是否在流程中的任何地方提交?我的意思是提交是在任何地方触发还是刷新或单击 elemnet 或类似的?事实是,webdriver 是一个阻塞 API,当触发加载/刷新或类似操作时,webdriver 将检查各种内容以检查页面是否已完成加载(即 document.readyState == 'complete')等。

不管怎样,应该可以覆盖这个策略,你可以尝试调查一下页面加载策略 https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#page-load-strategies-1.

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

Selenium FindElement 会阻塞,直到文件上传完成 的相关文章

随机推荐

  • Cake PHP 3 debug_kit 面板

    安装 CakePHP3 版本后 3 6 2 debug kit不显示面板 在日志文件中 警告 DebugKit 正在禁用自身作为您的主机newtest my不在已知的顶级域安全列表中 localhost dev invalid test e
  • 如何在seaborn python中合并两个relplot?

    我想使用 sns relplot 在单个图中绘制数据帧的两个数据列 数据框如下所示 index x axis col1 col2 group group2 0 0 27 26 A C 1 1 45 27 B D 2 2 48 22 A C
  • 如何从派生类获取基类实例

    我不知道这是否可能 但我正在尝试从派生类获取基类实例 在 C 中 我可以使用base关键字来访问基类的属性和方法 当然 但我想使用base本身 尝试这样做会导致 在此上下文中使用关键字 base 无效 error 示例代码 public c
  • 当浏览器选项卡关闭时销毁会话

    我有用户登录 注销应用程序 我想销毁会话 当我关闭浏览器 所有选项卡 时它工作正常 IE Firefox 工作 但我想在用户关闭单个选项卡时销毁会话 我在用 session set cookie params 0 session start
  • Web Api GET 方法可能具有可为 null 的 Guid 吗?

    我有一个 MVC Web API get 方法 我希望能够将可为空的 Guid 作为参数传递 如果我使用 Id null 设置 GET 我会收到 400 响应 我可以传递一个空的指南 但我宁愿不这样做 无论我将 URI 更改为 id id
  • 测试应用内购买是否需要有效的付费应用程序合同?

    我正在关注一个应用内购买教程 http www raywenderlich com 21081 introduction to in app purchases in ios 6 tutorial它还展示了如何使用沙箱环境 http dev
  • 无法找到或加载程序集“tmpAssembly,

    我正在尝试使用动态生成的类型作为名为 codeeffects www codeeffects com 的业务规则编辑器的源 但是我收到此异常 Could not find or load assembly tmpAssembly Versi
  • IIS 管理器错误数据。 0x80090005

    当我尝试在 高级设置 中设置物理路径凭据时 收到如下错误消息 Internet 信息服务 IIS 管理器 坏数据 HRESULT 异常 0x80090005 它阻止我设置特定用户来访问网络共享文件夹 奇怪的是 我有另一台具有相同配置的服务器
  • APE 和 Node.js 之间的主要区别是什么?

    有谁用过的可以分享一下经验吗 主要区别是什么 您更喜欢哪一个 谢谢 socket io 与 APE 的不同之处 socket io 是用 javascript node js 编码的 而 APE 是用 C 编码的 我相信当你想做出贡献时 这
  • 根据属性将 JavaScript 中的对象数组拆分为单独的数组

    我有一个像这样的数组 var flightPlanCoordinates lat 37 772 lng 122 214 status walking lat 36 772 lng 123 214 status walking lat 21
  • 禁用“您所做的更改可能无法保存”弹出窗口

    我使用以下前端代码导出 csv文档 HTML
  • 在 Vim 中同时保存并运行

    我做了很多 Python 快速模拟工作 并且不断保存 w 然后运行 有没有办法将这些动作结合起来 也许是 保存并运行 命令 好的 您正在寻找的最简单形式是管道命令 它允许您在同一行上运行多个 cmdline 命令 在您的情况下 这两个命令是
  • PowerShell:从文本文件读取行,构造源文件名和目标文件名,然后复制文件

    I m a 电源外壳 http en wikipedia org wiki Windows PowerShell新手 我很想能够编写这个脚本 我有一个文本文件 其中每一行都是文件名的一部分 没有路径或扩展名 我想要一个单行循环遍历文件的每一
  • 将字符串添加到 ArrayList [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要确保我正在正确构建这个程序 我
  • Python 抽象类 - 如何阻止实例化?

    我有 C 背景 该语言具有一些内置的 保护开发人员 功能 我知道 Python 采用 我们都是成年人 的方法 并让开发人员有责任深思熟虑 仔细编码 也就是说 Python 建议采用约定 例如私有实例变量的前导下划线 我的问题是 除了在文档字
  • Oracle 二进制数据类型

    有没有一种类型或方法如何在oracle中以二进制级别存储数据 我对 dml at table 和 pl sql 的操作都感兴趣 目前所有二进制元素都存储为 varchar2 1000 11111 0000 1111 但操作和数据存储大小相当
  • 创建 MySQL 存储过程来更新记录

    我正在转换所有现有的 MSSQL 数据库 并且存储过程被困在一个新的存储过程中 我需要在其中更新现有记录 一旦记录插入数据库并成功发送电子邮件 或至少传递到 SMTP 服务器 就会从 Web 表单调用该过程 我在 MSSQL 中有一个工作程
  • 如何编译c程序使其不依赖任何库?

    看来即使是一个 hello world 程序也依赖于几个库 libc so 6 gt lib64 libc so 6 0x00000034f4000000 lib64 ld linux x86 64 so 2 0x00000034f3c00
  • 我可以在 PHP 中使用字符串连接来定义类 CONST 吗?

    我知道您可以使用字符串连接来创建彼此的全局常量 define FOO foo define BAR FOO bar echo BAR 将打印 foobar 但是 我在尝试使用类常量执行相同操作时遇到错误 class foobar const
  • Selenium FindElement 会阻塞,直到文件上传完成

    短篇 当我使用 SendKeys path 触发文件上传到代理元素 由 ExecuteScript 放置 然后通过 jquery fileupload 插件代理到我的隐藏元素时 文件上传正常 但是当我尝试发出FindElement 它会阻塞