Как обойти это с костылями
1) Мы должны поймать / подождать файл, которыйПо умолчанию будет отображаться 'Downloads'
каталог
function checkExistsWithTimeout(filePath, timeout) {
return new Promise(function (resolve, reject) {
var timer = setTimeout(function () {
watcher.close();
reject(new Error('File did not exists and was not created during the timeout.'));
}, timeout);
fs.access(filePath, fs.constants.R_OK, function (err) {
if (!err) {
clearTimeout(timer);
watcher.close();
resolve();
}
});
var dir = path.dirname(filePath);
var basename = path.basename(filePath);
var watcher = fs.watch(dir, function (eventType, filename) {
if (eventType === 'rename' && filename === basename) {
clearTimeout(timer);
watcher.close();
resolve();
}
});
});
}
Проверять файл на всякий случай (опционально)
function checkFile(path) {
return new Promise(function (resolve, reject) {
fs.access(path, fs.F_OK, (err) => {
if (err) {
reject(new Error(err));
}
//file exists
console.log('File exists');
resolve();
});
});
}
Перемещать файл везде, где мынеобходимо после завершения загрузки (опционально)
function moveFile(fromPath, toPath) {
return new Promise(function (resolve, reject) {
fs.rename(fromPath, toPath, function (err) {
if (err) {
reject(new Error('File did not move.'));
throw err;
} else {
console.log('File moved');
resolve();
}
});
});
}
Пример
const fileName = await page.evaluate(() => {
return document.querySelector('.download-file-btn').textContent.trim();
});
await page.click('.download-file-btn');
await checkExistsWithTimeout('C:/Users/Me/Downloads/'+fileName, 10000);
await moveFile('C:/Users/Me/Downloads/'+fileName, 'C:/Users/me/Desktop/Videos/'+fileName);
2) Выгрузить файл из URL с использованием пакета 'request'
function download(uri, filename, callback) {
return new Promise(function (resolve, reject) {
request.head(uri, function (err, res, body) {
if (!err && res.statusCode == 200) {
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
request(uri)
.pipe(fs.createWriteStream(filename))
.on('error', function(response) {
console.log(err);
reject(new Error(err));
})
.on('close', function() {
callback();
resolve();
});
} else {
reject(new Error(err));
}
});
});
}
Пример
const videoSrc = await page.evaluate(() => {
return document.querySelector('video.vjs-tech').src;
});
await download(videoSrc, "C:/Users/Me/Downloads/Videos/video.mp4", function() {
console.log('downloaded');
});
У меня работает без опции 'setDownloadBehavior'
, иначе не получается.Теперь я могу нажать кнопку «Загрузить» или загрузить файл напрямую с некоторого URL-адреса, просто манипулируя файловой системой с узлом чуть-чуть.
Надеюсь, это кому-нибудь поможет.