Javascript 如何在e2e AngularJS测试中上传文件?

Javascript 如何在e2e AngularJS测试中上传文件?,javascript,testing,file-upload,angularjs,drag-and-drop,Javascript,Testing,File Upload,Angularjs,Drag And Drop,在我的一个视图中,我有一个文件上载控件。它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 如何在e2e测试中执行此操作1 1两个选项中的一个就足够了您可以使用Javascript blob上传文件。这需要FileApi,它与旧浏览器()不兼容。但是,既然您提到使用拖放上传,即使用FileApi,那就没什么大不了的了 有两种方法可以使用blobapi上传文件。一个很简单,另一个只是第一个的延续 使用Javascript,您可以创建一个新的blob,包括: var blob = new Bl

在我的一个视图中,我有一个文件上载控件。它支持通过拖放或单击按钮后打开的标准文件对话框上传文件

如何在e2e测试中执行此操作1



1两个选项中的一个就足够了

您可以使用Javascript blob上传文件。这需要FileApi,它与旧浏览器()不兼容。但是,既然您提到使用拖放上传,即使用FileApi,那就没什么大不了的了

有两种方法可以使用blobapi上传文件。一个很简单,另一个只是第一个的延续

使用Javascript,您可以创建一个新的blob,包括:

var blob = new Blob("content", contentType);
例如,这将创建一个包含文本“Hello World!”的blob对象


对于非纯文本文件,如pdf,也可以使用以下方法。您必须将文件转换为Base64(您可以使用类似的内容),并使用Base64数据创建blob

使用此函数(稍加修改的版本)创建blob

function b64toBlob(b64Data, contentType, sliceSize) {
b64Data = b64Data.replace(/\s/g, '');
contentType = contentType || '';
sliceSize = sliceSize || 1024;

function charCodeFromCharacter(c) {
    return c.charCodeAt(0);
}

var byteCharacters = atob(b64Data);
var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);
    var byteNumbers = Array.prototype.map.call(slice, charCodeFromCharacter);
    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
}

var blob = new Blob(byteArrays, {type: contentType});
return blob;
}

使用上述方法之一创建blob后,可以将其视为文件。例如,您可以将文件放入FormData对象中(如果您像这样进行上载):


*Filename参数目前似乎只在Chrome上起作用。

您到底需要测试哪部分功能?这是正确的拖放行为还是仅仅是文件上传?通过AJAX发送一个文件(例如,
new file()
)就足够了吗?我只需要上传一个文件(使用一个真实的文件),这样我就可以继续我的其他测试。因此,通过AJAX发送一个真实的文件是可行的,而发送一个使用new file()创建的空文件则不行。如果有帮助,该文件是一个xml文件,如果有办法,我可以在测试代码中创建该文件。如何编写端到端测试?支持。
function b64toBlob(b64Data, contentType, sliceSize) {
b64Data = b64Data.replace(/\s/g, '');
contentType = contentType || '';
sliceSize = sliceSize || 1024;

function charCodeFromCharacter(c) {
    return c.charCodeAt(0);
}

var byteCharacters = atob(b64Data);
var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);
    var byteNumbers = Array.prototype.map.call(slice, charCodeFromCharacter);
    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
}

var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
var pdf = "JVBERi0xLjQKJcfsj6IKNSAwIG9...=="; //base64 encoded file as a String
var pdfBlob = b64toBlob(pdf, "application/pdf", 1024);
var fd = new FormData();
fd.append("uploadedFile", pdfBlob, "My PDF.pdf"*);