2015-08-16 2 views
1

У меня нет подсказки, с чего начать. В основном мне нужно, чтобы CasperJS пропустил около 15 разных страниц, каждая страница, через которую он проходит, должна получить данные для 150 разных местоположений, которые должны быть установлены как значения cookie. Для каждого местоположения мне нужно проверить данные на 5 разных дат.Как сделать вложенную петлю на многие страницы в CasperJS

Любой из них кажется довольно прямолинейным, но попытка получить все три случится сбивает меня с толку.

Я попытался установить его таким образом:

for(Iterate through URLs){ 
    for(Iterate through locations){ 
    for(Iterate through dates){ 
     phantom.addCookie({ 
     // Cookie data here based on location and date 
     }); 
     casper.start(url) 
     .then(function(){ 
     // Do some stuff here 
     }) 
     .run(); 
    } 
    } 
} 

По сути, это делает петлю через все, а затем загрузить страницу, основанную на последней ссылке, на последнем месте, на последнюю дату. Но каждое другое место пропускается. Есть ли более простой способ сделать это? Возможно, лучше, есть ли способ сказать, что мой цикл JavaScript ждет, пока casper завершит выполнение того, что ему нужно сделать, прежде чем перейти к следующей итерации цикла?

Я рад предоставить более подробную информацию, если необходимо. Я попытался упростить процесс, насколько это возможно, без вырезания необходимой информации.

ответ

1

Это в значительной степени. Две вещи, которые нужно посмотреть:

  • casper.start() и casper.run() должен вызываться только один раз в сценарий. Вы можете использовать casper.thenOpen(), чтобы открыть разные URL-адреса.

  • Имейте в виду, что все функции casper.then*() и casper.wait*() являются асинхронными шаговыми функциями и планируются только после текущего шага. Поскольку JavaScript имеет объемный уровень, вам нужно «исправить» итерационные переменные для каждой итерации, иначе вы получите только последний URL. (More information)

Пример кода:

casper.start(); // deliberately empty 

for (var url in urls) { 
    for (var location in locations) { 
     for (var date in dates) { 
      (function(url, location, date){ 
       casper.then(function(){ 
        phantom.addCookie({ 
         // Cookie data here based on location and date 
        }); 
       }).thenOpen(url) 
        .then(function(){ 
         // Do some stuff here 
        }); 
      })(url, location, date); 
     } 
    } 
} 

casper.run(); // start all the scheduled steps 

Если вы используете Array.prototype.forEach вместо того, для цикла, то вы можете смело пропустить использование IIFE исправить переменные.

Я не уверен, но вам может понадобиться сначала открыть страницу, чтобы добавить файл cookie для этого домена. Возможно, PhantomJS принимает cookie только в том случае, если этот домен для этого файла cookie открыт.

+0

Ты герой. По-прежнему существует проблема с файлами cookie, поэтому я буду играть с этим и попробовать ваше предложение для этого, но он загружает страницу и делает все, что мне нужно, для каждой итерации цикла, по крайней мере. Благодаря! –

+1

Извините, я забыл поместить код файла cookie в один шаг. Смотрите, если это лучше –

+0

Да, это прекрасно работает. Спасибо огромное! –

Смежные вопросы