使用Fluentlenium在dropzone.js中上传文件

时间:2013-12-04 22:15:31

标签: javascript selenium dropzone.js fluentlenium

我正在寻找使用Fluentlenium和DropZone.js(http://www.dropzonejs.com/)编写上传文件的测试。 Dropzone.js以模态工作,然后你可以拖放或上传正常的方式。

一旦您点击上传测试崩溃,因为您不再在浏览器中。

我发现很多帖子都在Selenium中使用以下内容:

WebElement fileInput = driver.findElement(By.xpath("//input[@type='file']"));
fileInput.sendKeys("C:/path/to/file.jpg");

但是我无法发送任何东西,因为在使用DropZone.js时它们甚至不是输入类型=“文件”。

我看到的唯一输入类型都是隐藏的类型。

<input type="hidden" name="key" value="temp/${filename}">
<input type="hidden" name="AWSAccessKeyId" value="secret">
<input type="hidden" name="acl" value="private">
<input type="hidden" name="success_action_redirect" value="">
<input type="hidden" name="policy" value="secret=">
<input type="hidden" name="signature" value="secret">
<input type="hidden" name="Content-Type" value="application">

我们也使用Amazon Web Server上传文档,似乎所有内容都在使用以下脚本:

<script id="hiddenKeyPairs" type="text/javascript">
  var hiddenKeyPairs = {
    key:  'temp/${filename}',
    AWSAccessKeyId: 'secret',
    acl: 'private',
    "success_action_redirect": '',
    policy: 'secret',
    signature: 'secret/secret',
    "Content-Type": 'application'
  };

  var formAction = 'https://secret.com/';

</script>

位于我的页面上。

对于https://github.com/FluentLenium/FluentLenium#driver,我没有看到任何有用的内容。

我是否需要以某种方式将文件发送到上述脚本中的密钥哈希?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定AWS部分,但我对文件上传(Programmatically upload / add file via Dropzone e.g. by Selenium)以及一些可能的解决方案提出了类似的问题。我觉得他们不是很健壮,但基本上是:

方法1 :使用Java Robot模拟GUI操作 -

    // this opens the file browser window
    driver.findElement(By.id("uploadDropzone")).click();

    // put the file path in clipboard, paste (C-V) to the window, enter.
    StringSelection ss = new StringSelection("some file path");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
    Robot robot = new Robot();
    Thread.sleep(2000);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    Thread.sleep(5000);    // need some wait for GUI action to work...
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER)

方法2 :在代码中执行所有操作(hacky ...) - 是的,有一个文件输入元素,但只在Dropzone.js中定义,可以使用{{1}选择}。但是你也必须让它可见(因为Selenium只能对可见元素起作用),然后可以在它上面调用$(".dz-hidden-input")。然后,再次在Javascript中,从该元素中检索sendKeys对象,然后传递给Dropzone对象上的File