2012-04-27 2 views
5

У меня есть сценарий (ниже), который сбрасывает сайт с трехэтапным процессом. он отлично работает при установке максимум на 1 страницу за раз. однако, когда я увеличиваю это до 2 за один раз, все начинает становиться неуклюжим. onFinished пожары раньше, чем я ожидал бы, и страница еще не полностью загружена. из-за этого остальная часть моего скрипта ломается. любая идея, почему это может произойти? Я должен добавить, что я использую самую новую версию (1.5).Неожиданное поведение при загрузке PhantomJS с несколькими страницами

MAX_PAGES = 1 
### 
changing MAX_PAGES to >1 causes some pages onFinished event to fire before 
the page is fully rendered. this is evident by the fact that there are >1 images 
for some pages. i havent been able to reproduce using microsoft.com, but on some 
pages i was working on the first onLoadFinished seemed to be called before the page 
was actually fully loaded based on the look of the rendered images 
### 

newPage = (id) -> 
context = {} 
context.id = id 
context.step = 0 
context.page = require('webpage').create() 
context.page.onLoadStarted = -> 
    context.step++ 
context.page.onLoadFinished = (status) -> 
    console.log status 
    if status is 'success' 
     context.page.render("#{context.id}_#{context.step}.png") 
    else 
     context.page.release() 
     context.page.open('http://www.microsoft.com') 
     console.log 'started loading' 

newPage id for id in [1..MAX_PAGES] 

ответ

4

Я думаю, что проблема связана с тем, что каждая веб-страница в PhantomJS использует тот же QNetworkAccessManager, таким образом, finished() сигнал обжига, когда каждый объект веб-страница загрузится. Возможно, потребуется внести изменения в код PhantomJS, чтобы исправить эту проблему. Я заметил это раньше, когда пытаюсь загрузить несколько страниц параллельно в PhantomJS. Приложение, в котором я работаю, использует QtWebkit и одновременно загружает несколько страниц, поэтому я должен убедиться, что каждая веб-страница получает свой собственный QNetworkAccessManager, так что готовые() сигналы не мешают друг другу.

3

Чтобы обходить несколько страниц, см. Пример follow.js, который связан с библиотекой. https://github.com/ariya/phantomjs/blob/master/examples/follow.js

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

+0

Если не рекурсивный вызов, как в этом примере, по крайней мере, обратный вызов, который вызовет следующий обход. –

+0

Ваша ссылка сломана :( – Julien

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