8

我正在量角器中编写测试,该量角器是一个基于 JS 的框架和用于运行测试的 selenium 测试堆栈。我面临一个必须测试文件上传的问题。

我遇到的问题是我要上传的文件在测试包中,而 selenium 节点是一个单独的服务器,因此它不会获取文件。我尝试使用文件描述符,尽管文件名已设置,但内容未上传。

下面是我的代码片段。

  var remote = require('selenium-webdriver/remote');
   browser.setFileDetector(new remote.FileDetector());
   var absolutePath = path.resolve(__dirname, "../specs/data/baseProducts.csv");
   $('input[type="file"]').sendKeys(absolutePath);

你有相同的输入吗?或者你知道有人用 Selenium 在 JS 中编写过文件上传测试吗?您的帮助将不胜感激

4

3 回答 3

14

首先,要使文件上传与远程 selenium 服务器一起使用,您需要最新的protractor(当前为 3.0.0)(它将具有最新的selenium-webdrivernodejs 包作为依赖项)。

然后,这两行对于能够通过线路将文件发送到 selenium 节点至关重要:

var remote = require('selenium-webdriver/remote');
browser.setFileDetector(new remote.FileDetector());

而且,现在您应该能够像在本地运行测试一样上传文件。


完整的工作测试(在 BrowserStack 上测试,非常适合我):

var path = require('path'),
    remote = require('selenium-webdriver/remote');

describe("File upload test", function () {
    beforeEach(function () {
        browser.setFileDetector(new remote.FileDetector());
        browser.get("https://angular-file-upload.appspot.com/");
    });

    it("should upload an image", function () {
        var input = element(by.model("picFile")),
            uploadedThumbnail = $("img[ngf-src=picFile]");

        // no image displayed
        expect(uploadedThumbnail.isDisplayed()).toBe(true);

        // assuming you have "test.jpg" right near the spec itself
        input.sendKeys(path.resolve(__dirname, "test.jpg"));

        // there is a little uploaded image displayed
        expect(uploadedThumbnail.isDisplayed()).toBe(true);
    });
});

另见相关问题:

于 2015-12-19T04:12:47.813 回答
1

感谢@alecxe 的回答!

我刚遇到这种情况,试图将一些文件上传到 BrowserStack。就我而言,我使用的是Cucumber - Protractor - NodeJs - BrowserStack。此代码已经过测试,可以在本地环境和 BorwserStack 中使用。

let path = require('path');
let remote = require('selenium-webdriver/remote');

this.When(/^I upload a file$/, () => {
    browser.setFileDetector(new remote.FileDetector());

    var fileToUpload = '../image_with_title.jpg';
    var absolutePath = path.join(__dirname, fileToUpload);

    page.fileupload.sendKeys(absolutePath);
});

神奇的线是:

let remote = require('selenium-webdriver/remote');
于 2018-02-20T15:04:59.017 回答
0

这个解决方案对我有用。下面两行代码起到了作用。

var remote = require('selenium-webdriver/remote');
browser.setFileDetector(new remote.FileDetector());

我能够上传文件远程服务器。

于 2020-08-28T12:25:54.357 回答