短篇:
当我使用 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()
.
进度会持续进行,直到得到响应,此时最终的对话框会显示一些结果,并且可以使用另一个按钮将其关闭。
所以,简而言之:
- 打开一个对话框
- 将对话框中的模板设置为简介
- 选择一个文件
- 更改对话框中的模板以进行操作
- 启动 ajax(或 iframe)上传
- 更改对话框中的模板以完成
Selenium 无法访问 fileUpload 输入(隐藏),因此为了让 Selenium 触发文件上传,我最终不得不执行一些如下脚本:
-
添加新的输入元素:
jQuery('', {id: 'tmpId', type: 'file', name:'files[]'}).appendTo('modalDivId')
-
触发回调:
$('#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。
有什么想法吗?