【发布时间】:2016-09-11 05:36:51
【问题描述】:
我正在编写一个 Selenium 测试用例,其中一个步骤是通过 Dropzone.js 上传文件。
(因为 Selenium 可以在浏览器中运行 Javascript,所以如果它可以在 Javascript 中以编程方式完成,那也很好。)
我想避免一直模拟打开文件浏览器窗口、选择文件等,因为这超出了 Web 驱动程序可以处理的范围并且变得非常复杂。在伪代码中,我想做这样的事情:
1. Select some Dropzone element
2. Set file path
3. Submit (upload the file)
现有问题 (Unable to upload file using python selenium webdriver on http://www.dropzonejs.com) 中提到了一种可能的方法,它使用“dz-hidden-input”元素(DOM 文件输入)。
不幸的是,它不起作用(至少在当前版本的 Dropzone 中不起作用)- 将文件设置为元素后,Dropzone .files 仍然是空的,并且不会进行上传。
查看 Dropzone 源代码后,我通过扩展上述内容提出了一个可行的解决方案:
1. Set file path in the "dz-hidden-input" element
2. Use javascript to retrieve the File object from the element
3. Pass the file to dropzone.addFile(file)
但我担心这确实是一个 hack,因为 hidden-input 和 .addFile 都没有记录,如果 Dropzone 更改实现等,测试将在未来中断。
有没有更好的/记录在案的方法来做到这一点?
(澄清一下 - 我正在尝试上传 新 文件,而不是显示 Dropzone 常见问题解答中提到的现有文件)
【问题讨论】:
-
我们通过服务器端的soap请求并通过selenium作为UI自动化,例如单击输入按钮->使用Web驱动程序剪贴板/Java机器人->粘贴/键入文件位置+文件名>点击机器人输入。很抱歉,但我不知道 dropzone js 的想法,但除了您希望通过 javascript 级别以编程方式上传的方式之外,还有两种方式。
-
谢谢,是的,我还通过使用 Java 机器人来模拟您提到的 GUI 操作来使其工作(尽管如果可能的话,我宁愿不必走那条路......)。作为参考,我在此找到了一些示例代码:sqa.stackexchange.com/questions/12851/…,但为了使其工作,我必须在操作之间插入一些 Thread.sleep。 (此外,虽然 Dropzone 不是常规的文件输入元素,但可以通过 ID 找到它,然后调用 click,这将打开文件浏览器窗口)。
-
是的,您需要添加足够的编号。的睡眠,因为它与文件资源管理器交互并且需要一些时间来打开并且在上传之后,它需要根据文件大小进行所需的睡眠。添加为答案...
标签: javascript selenium dropzone.js