Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过Dropzone(如Selenium)以编程方式上载/添加文件_Javascript_Selenium_Dropzone.js - Fatal编程技术网

Javascript 通过Dropzone(如Selenium)以编程方式上载/添加文件

Javascript 通过Dropzone(如Selenium)以编程方式上载/添加文件,javascript,selenium,dropzone.js,Javascript,Selenium,Dropzone.js,我正在编写一个Selenium测试用例,其中一个步骤是通过Dropzone.js上传一个文件 (因为Selenium可以在浏览器中运行Javascript,所以如果它可以在Javascript中以编程方式完成,那也很好。) 我希望避免一路模拟打开文件浏览器窗口、选择文件等,因为这超出了web驱动程序的处理范围,变得非常复杂。在伪代码中,我想做如下操作: 1.选择一些Dropzone元素 2.设置文件路径 3.提交(上传文件) 现有问题()中提到了一种可能的方法,它使用“dz hidden in

我正在编写一个Selenium测试用例,其中一个步骤是通过Dropzone.js上传一个文件

(因为Selenium可以在浏览器中运行Javascript,所以如果它可以在Javascript中以编程方式完成,那也很好。)

我希望避免一路模拟打开文件浏览器窗口、选择文件等,因为这超出了web驱动程序的处理范围,变得非常复杂。在伪代码中,我想做如下操作:


1.选择一些Dropzone元素
2.设置文件路径
3.提交(上传文件)

现有问题()中提到了一种可能的方法,它使用“dz hidden input”元素(DOM文件输入)

不幸的是,它不起作用(至少在Dropzone的当前版本中不起作用)-将文件设置为元素后,Dropzone.files仍然为空,并且不会进行上载

在查看Dropzone源代码后,我通过扩展上述内容提出了一个可行的解决方案:


1.在“dz隐藏输入”元素中设置文件路径
2.使用javascript从元素中检索文件对象
3.将文件传递到dropzone.addFile(文件)

但我担心的是,这确实是一个黑客行为,因为隐藏的输入和.addFile都没有文档记录,如果Dropzone更改实现等,测试将在将来中断

有没有更好的/有文档记录的方法来做到这一点


(为了澄清-我试图上传一个新的文件,而不是像Dropzone常见问题解答中提到的那样显示现有文件)

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

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();
    }
}

我们通过服务器端soap请求进行操作,并通过selenium实现UI自动化,例如,单击输入按钮->使用web驱动程序剪贴板/java robot->粘贴/键入文件位置+文件名>点击机器人输入。很抱歉,我不知道dropzone js的想法,但这是两种方式,而不是通过javascript级编程上传的方式。谢谢,是的,正如你所提到的,我还通过使用Java Robot来模拟GUI操作实现了这一点(尽管我希望如果可能的话,不必走这条路线……)。作为参考,我在以下内容中找到了一些示例代码:,但为了使其正常工作,我必须在操作之间插入一些Thread.sleep。(另外,虽然Dropzone不是一个常规的文件输入元素,但可以通过ID找到它,然后调用单击,这将打开文件浏览器窗口)。是的,您需要添加足够数量的睡眠,因为这会与文件资源管理器交互,打开需要一些时间,上传后还需要根据文件大小进行所需的睡眠。添加作为答案…只是为了确认此方法确实有效。但正如我在问题中提到的,我不喜欢去模拟GUI操作,比如打开浏览器(并且必须添加任意等待,这有点不确定),我仍然在寻找一种直接与Dropzone一起工作的解决方案(如果存在这种方法:-),谢谢Ken。您能告诉我您的项目使用哪种服务器端解决方案吗?我的意思是这是第二种选择,第三种可能是通过Dropzone,不幸的是,我没有意识到这是一种工具。我在服务器上使用node.js,接受标准的HTTP多部分文件请求。但这更像是客户端的问题。Dropzone.js是一个客户端Javascript组件,它可以处理拖放文件,但对于最简单的用例,它可以像普通的HTML文件输入控件一样工作—单击它,它将打开一个文件浏览器。对于普通的HTML文件输入控件,只需使用WebDriver调用即可轻松上传文件,例如
driver.findElement(By.xpath(//input[@type='file'])).sendKey(“foo.txt”)
;但不幸的是,对于Dropzone组件,同样的方法不起作用。