Как на nighmarejs обойти несколько страниц и сохранить их в pdf?
ошибка в том что вы забыли что 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.