简短:
当我使用 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);
正常使用时,用户单击标签,这会触发输入,然后触发并添加回调,检查大小/类型,如果确定,则更改为“进展”对话框,并执行数据。提交()
。
进度会持续进行,直到得到响应,此时最终对话框会显示一些结果,并且可以使用另一个按钮将其关闭。
简单来说:
- 打开一个对话框
- 将对话框中的模板设置为简介
- 选择一个文件
- 更改对话框中的模板以取得进展
- 启动 ajax(或 iframe)上传
- 更改对话框中的模板以完成
Selenium 无法访问 fileUpload 输入(隐藏),因此为了让 Selenium 触发文件上传,我最终不得不执行一些如下脚本:
添加新的输入元素:
jQuery('', {id: 'tmpId', type: 'file', name:'files[]'}).appendTo('modalDivId')
触发回调:
$('#tmpId').bind('更改', 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')等。
无论如何,应该可以覆盖这个策略,你可以尝试调查page load strategies 。
关于javascript - Selenium FindElement 会阻塞,直到文件上传完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108482/