用于下载pdf文件的量角器e2e测试用例

时间:2014-02-21 13:24:43

标签: selenium-webdriver jasmine protractor

有谁能告诉我如何编写测试用例以获取使用jasmine框架下载pdf文件的链接? 提前谢谢。

5 个答案:

答案 0 :(得分:45)

我目前可以设置下载路径位置

capabilities: {
    'browserName': 'chrome',
    'platform': 'ANY',
    'version': 'ANY',
    'chromeOptions': {
        // Get rid of --ignore-certificate yellow warning
        args: ['--no-sandbox', '--test-type=browser'],
        // Set download path and avoid prompting for download even though
        // this is already the default on Chrome but for completeness
        prefs: {
            'download': {
                'prompt_for_download': false,
                'default_directory': '/e2e/downloads/',
            }
        }
    }
}

对于远程测试,您需要更复杂的基础架构,例如设置Samba共享或网络共享目录目标。

火狐


var FirefoxProfile = require('firefox-profile');
var q = require('q');

[...]
getMultiCapabilities: getFirefoxProfile,
framework: 'jasmine2',

[...]
function getFirefoxProfile() {
    "use strict";
    var deferred = q.defer();
    var firefoxProfile = new FirefoxProfile();
    firefoxProfile.setPreference("browser.download.folderList", 2);
    firefoxProfile.setPreference("browser.download.manager.showWhenStarting", false);
    firefoxProfile.setPreference("browser.download.dir", '/tmp');
    firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");

    firefoxProfile.encoded(function(encodedProfile) {
        var multiCapabilities = [{
            browserName: 'firefox',
            firefox_profile : encodedProfile
        }];
        deferred.resolve(multiCapabilities);
    });
    return deferred.promise;
}

最后也许显而易见,要触发下载,请点击下载链接,例如

$('a.some-download-link').click();

答案 1 :(得分:40)

我需要根据预期结果检查下载文件的内容(在我的情况下为CSV导出),并发现以下内容:

var filename = '/tmp/export.csv';
var fs = require('fs');

if (fs.existsSync(filename)) {
    // Make sure the browser doesn't have to rename the download.
    fs.unlinkSync(filename);
}

$('a.download').click();

browser.driver.wait(function() {
    // Wait until the file has been downloaded.
    // We need to wait thus as otherwise protractor has a nasty habit of
    // trying to do any following tests while the file is still being
    // downloaded and hasn't been moved to its final location.
    return fs.existsSync(filename);
}, 30000).then(function() {
    // Do whatever checks you need here.  This is a simple comparison;
    // for a larger file you might want to do calculate the file's MD5
    // hash and see if it matches what you expect.
    expect(fs.readFileSync(filename, { encoding: 'utf8' })).toEqual(
        "A,B,C\r\n"
    );
});

我发现Leo的配置建议有助于将下载保存在可访问的地方。

30000ms超时是默认值,因此可以省略,但我会将其保留为提醒,以防有人想要更改它。

答案 2 :(得分:1)

它可能是检查href属性的测试,如下所示:

var link = element(by.css("a.pdf"));
expect(link.getAttribute('href')).toEqual('someExactUrl');

答案 3 :(得分:1)

上述解决方案不适用于远程浏览器测试,例如通过BrowserStack。仅适用于Chrome的替代解决方案可能如下所示:

if ((await browser.getCapabilities()).get('browserName') === 'chrome') {
  await browser.driver.get('chrome://downloads/');
  const items =
    await browser.executeScript('return downloads.Manager.get().items_') as any[];
  expect(items.length).toBe(1);
  expect(items[0].file_name).toBe('some.pdf');
}

答案 4 :(得分:-1)

我过去做的一件事是使用HTTP HEAD命令。基本上,它与'GET'相同,但它只检索标题。

不幸的是,Web服务器需要明确支持'HEAD'。如果是,您可以实际尝试URL,然后在Content-Type中检查'application / pdf',而无需实际下载文件。

如果服务器未设置为支持HEAD,您可以查看上面建议的链接文本。