Как на nighmarejs обойти несколько страниц и сохранить их в pdf?

Нужно обойти несколько страниц в ЛК и сохранить результаты в pdf. Проблема в том, что не сохраняется.
Авторизируюсь, перехожу на внутреннюю страницу, выдергиваю ссылки на страницы, которые нужно будет сохранить, обхожу их, достаю title для названия файла и хочу сохранить в pdf, но ничего не происходит.

Вот код:
var fs = require('fs');
var Nightmare = require('nightmare');
var ms = Nightmare({
    show: false,
    width: 921,
    height: 900
});

var page_params = Object;
var page=ms.goto('http://domain')
    .type('form input#login', 'login')
    .type('form input#password', 'password')
    .click('form [type=submit]')
    .wait(1000);

page.goto('http://domain/url')
    .wait(1000)
    .title()
    .then(function (title) {
        title = title.replace("/", "");
        page_params.title = title
        console.log(title)
        if (!fs.existsSync(title)){
            fs.mkdirSync(title);
        }
        page.evaluate(function () {
            var urls=[];
            $(".passedClass a.head_type-test").map(function (index, element) {
                urls.push('domain' + $(element).attr('href'));
            })
            return urls;
        })
            .then(function (urls) {
                console.log('map urls');
                urls.forEach(function(url,index){
                    console.log(url)
                    page.goto(url)
                        .wait(1000)
                        .title()
                        .then(function(per_title){
                            page_params.per_title = per_title
                            page_params.path=page_params.title+'/'+index+' '+page_params.per_title+'.pdf'

                            console.log(page_params)
                            //ничего не сохраняет, console.log выше отработал, значит до сюда дошли
                            page.pdf(page_params.path)
                        })


                })
            },page_params)
    },page_params)


Колдую уже весь день, какие-то только бредовые модификации в код не вносил. Надеюсь на вашу помощь.
  • Вопрос задан
  • 353 просмотра
Решения вопроса 2
@trubel
ошибка в том что вы забыли что nodejs асинхронен и nightmare не ждет пока файл сохранится, сразу переходит на другой адрес, а с таким кодом и правда нетрудно сойти с ума :)
на похожей задаче я использовал async/await:
var Nightmare = require('nightmare');
var browser = Nightmare();

async function login() {
	// заходим
}

async function getLinks() {
	var result = [];
	// вытаскиваем ссылки
	await browser
		.goto('url')
		...
		.then(function(data){
			result = data.slice();
		});
	return result
}

async function savePDF(url) {
	// сохраняем
	await browser
		.goto(url)
		.pdf(...);
}

async function run() {
	await login();
	var links = await getLinks();
	for (var i=0; i<links .length: i++) {
		await savePDF(links[i]);
	}
}


await дает сигнал движку чтобы он ждал окончания выполнения и не двигался дальше.
async указывает что функция асинхронная, и только функции с async могут использовать await
Ответ написан
Если есть список ссылок, то все очень просто, надо просто обойти эти ссылки. Если нужно по очереди, то просто после then вызываем ту же функцию рекурсивно или теоретически можно использовать async await вместе с циклом for (не forEach). Если порядок обхода не важен, можно опробовать Promise.all().
Еще есть полезная библиотека для работы с множественными асинхронными операциями async.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы