【问题标题】:Programmatically upload / add file via Dropzone e.g. by Selenium通过 Dropzone 以编程方式上传/添加文件,例如通过硒
【发布时间】: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


【解决方案1】:

点击输入按钮->使用web驱动剪贴板/java机器人->粘贴/键入文件位置+文件名>点击机器人回车。

final String fileName = "textfile.txt";
final String filePath = "\\data\\public\\other\\" + fileName;
zUploadFile (filePath );

public void zUploadFile (String filePath) throws HarnessException {

    // Put path to your image in a clipboard
    StringSelection ss = new StringSelection(filePath);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
    // OR use java robot for entire filepath
    Thread.sleep(10000);

    // Imitate mouse events like ENTER, CTRL+C, CTRL+V
    Robot robot;
    try {
        robot = new Robot();
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);

    } catch (AWTException e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 只是为了确认这种方法确实有效。但是正如我在我的问题中提到的那样,我不想去模拟打开浏览器之类的 GUI 操作(并且必须添加有点不确定的任意等待),我仍在寻找直接与 Dropzone 一起使用的解决方案(如果这种方法存在:-)
  • 谢谢肯。您能告诉我您的项目使用哪种服务器端解决方案吗?我的意思是这是第二种选择,第三种可能是通过 Dropzone 不幸的是我不知道它是一种工具。
  • 我在服务器上使用 node.js,接受标准的 HTTP 多部分文件请求。但这更多是客户端问题。 Dropzone.js 是一个客户端 Javascript 组件,它可以处理拖放文件,但对于最简单的用例,它可以像普通的 HTML 文件输入控件一样工作——单击它会打开一个文件浏览器。对于普通的 HTML 文件输入控件,只需使用 WebDriver 调用即可轻松上传文件,例如driver.findElement(By.xpath("//input[@type='file']")).sendKey("foo.txt") ;但不幸的是,这对 Dropzone 组件不起作用。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2013-07-09
  • 1970-01-01
  • 2020-04-10
相关资源
最近更新 更多