web-dev-qa-db-fra.com

Cas de test Protractor e2e pour télécharger le fichier pdf

Quelqu'un peut-il me dire comment écrire un scénario de test pour un lien pour télécharger un fichier pdf en utilisant le framework jasmine? Merci d'avance.

37
user3061796

Je peux actuellement définir l'emplacement du chemin de téléchargement

Chrome

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/',
            }
        }
    }
}

Pour les tests à distance, vous auriez besoin d'une infrastructure plus complexe, comme la configuration d'un partage Samba ou d'une destination de répertoire partagé réseau.

Firefox


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

Enfin et peut-être évident, pour déclencher le téléchargement, vous cliquez sur le lien de téléchargement comme vous le savez, par exemple.

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

J'avais besoin de vérifier le contenu du fichier téléchargé (une exportation CSV dans mon cas) par rapport à un résultat attendu et j'ai constaté que les éléments suivants fonctionnaient:

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

J'ai trouvé la suggestion de configuration de Leo utile pour permettre au téléchargement d'être enregistré dans un endroit accessible.

Le délai d'expiration de 30000 ms est la valeur par défaut, il pourrait donc être omis, mais je le laisse comme rappel au cas où quelqu'un voudrait le changer.

42
Stephen Baillie

ce pourrait être le test pour vérifier l'attribut href comme ceci:

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

Les solutions ci-dessus ne fonctionneraient pas pour les tests de navigateur à distance, par exemple via BrowserStack. Une solution alternative, juste pour Chrome, pourrait ressembler à ceci:

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');
}
1
Rene Hamburger