Может ли кто-нибудь сказать мне, как написать тестовый пример для ссылки для загрузки pdf файла с использованием jasmine framework? Спасибо заранее.
Экран Protractor e2e для загрузки pdf файла
Ответ 1
В настоящее время я могу установить путь загрузки
Хром
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 или сетевого каталога общего назначения.
Fire Fox
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();
Ответ 2
Мне нужно было проверить содержимое загруженного файла (экспорт 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 MD5
// hash and see if it matches what you expect.
expect(fs.readFileSync(filename, { encoding: 'utf8' })).toEqual(
"A,B,C\r\n"
);
});
Я обнаружил, что предложение по настройке Leo позволяет сохранить загрузку в доступном месте.
Тайм-аут 30000 мс является значением по умолчанию, поэтому его можно опустить, но я оставляю его как напоминание на случай, если кто-то захочет его изменить.
Ответ 3
это может быть тест для проверки атрибута href следующим образом:
var link = element(by.css("a.pdf"));
expect(link.getAttribute('href')).toEqual('someExactUrl');
Ответ 4
Приведенные выше решения не будут работать для удаленного тестирования браузера, например, через 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');
}
Ответ 5
Одна вещь, которую я делал в прошлом, - использовать команду HTTP HEAD. В принципе, это то же самое, что и "GET", но оно только извлекает заголовки.
К сожалению, веб-сервер должен явно поддерживать "HEAD". Если это так, вы можете попробовать URL-адрес, а затем проверить "приложение/pdf" в Content-Type, не загружая файл.
Если сервер не настроен для поддержки HEAD, вы можете просто проверить текст ссылки, как было предложено выше.