Подтвердить что ты не робот

Подождите, пока приложение angular будет полностью отображено с phantom script

Я пишу script, который генерирует png-изображения с каждой страницы моего интерфейса. Я использую angular для пользовательского интерфейса и захватываю страницы phantom.

Время просмотра до тех пор, пока angular не закончит рендеринг, поэтому я должен немного подождать, прежде чем захватить:

var page = require('webpage').create();
page.open('http://localhost:9000/', function () {
  window.setTimeout(function () {
    page.render('snapshot.png');
    phantom.exit();
  }, 2000);
});

Интересно, есть ли лучший способ достичь этого. Я обнаружил, что angular может генерировать событие, когда страница полностью отображается:

$scope.$on('$viewContentLoaded', function () {
  // do something
});

И нашел способ связи с phantom с onCallback, чтобы я мог написать что-то вроде:

$scope.$on('$viewContentLoaded', function () {
  window.callPhantom({ hello: 'world' });
});

Затем в другом месте в phantom script:

page.onCallback = function() {
  page.render('snapshot.png');
  phantom.exit();
};

Но я теряюсь в том, как вводить дескриптор angular $viewContentLoaded из phantom script.

Я не знаю, можно ли evaluate/evalueateAsyn...

page.evaluateAsync(function () {
  $scope.$on('$viewContentLoaded', function () {
    window.callPhantom({ hello: 'world' });
  });
});

Возможно, я мог бы каким-то образом получить доступ к $scope. Любые идеи?

4b9b3361

Ответ 1

Связанный API PhantomJS - onCallback; вы можете найти документ API в вики.

// in angular
$scope.$on('$viewContentLoaded', function () {
  window.callPhantom();
});

// in the phantomjs script
var page = require('webpage').create();
page.onCallback = function() {
  page.render('snapshot.png');
  phantom.exit();
};
page.open('http://localhost:9000/');

Вы можете получить доступ к $rootScope, обратившись к инжектору; например, если вы используете директиву ng-app, вы можете найти элемент с директивой и называть .injector().get("$rootScope") на нем. Однако я не уверен, что событие $viewContentLoaded уже будет запущено.