casperjs: как зациклить страницу с обновлением ajax

У меня есть страница, которая обновляется через ajax (поэтому страница не загружается) с помощью кнопки «Далее». Я хотел бы нажать кнопку «Далее» (функция onclick js) и каждый раз брать исходный код страницы и повторять это N раз.

var casper = require('casper').create();
var limit = 10, count = 0;

casper.start('http://example.com');

casper.then(function() {

casper.repeat(limit, function() {

    this.echo(this.getHTML());
    this.echo('-------------------------');
    this.click('.next-btn');
    wait(2000);
    count++;

});

});

casper.run();

Это фиксирует источник, но продолжает получать тот же источник, а не обновленную разметку после нажатия кнопки «Далее».


person jpmorris    schedule 30.09.2013    source источник


Ответы (2)


Если я не ошибаюсь, у вас неправильно используется wait(2000). Ожидание не останавливает выполнение. Следующая строка count++ и цикл продолжается.

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

casper.start('http://yoursite.tld/');

casper.wait(1000, function() {
    this.echo("I've waited for a second.");
});

casper.run();

Если бы вы сделали приведенный ниже код, вы не получили бы желаемого результата:

casper.start('http://yoursite.tld/');

casper.wait(1000);
this.echo("I've waited for a second.");

casper.run();    

Таким образом, вам нужно связать это: Позвольте мне попробовать изменить ваш код:

var casper = require('casper').create();
var limit = 10, count = 0, waitms = 2000;

casper.start('http://example.com');

casper.then(function() {
    // Raise a custom event (for the first load)
    casper.emit("ajax.content.loaded");

    // Event listener for a custom event
    casper.on("ajax.content.loaded", function () {

        // Increase counter
        count++;
        // Break loop when limit is reached
        if(c > limit) {
            casper.exit();
        }

        this.echo(this.getHTML());
        this.echo('-------------------------');
        this.click('.next-btn');

        casper.wait(waitms, function () {
            // Recursively raise the custom event after waiting a bit
            casper.emit("ajax.content.loaded");
        });

    });

});

casper.run();

Надеюсь это поможет.

person sudipto    schedule 01.10.2013

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

Возьмем, к примеру, этот сайт: http://angular.github.io/angular-phonecat/step-11/app/#/phones

Это учебник Google по AngularJS. Когда вы просматриваете источник, все, что он содержит, это:

<body>
  <div ng-view></div>
</body>

Но в консоли JavaScript запуск

document.body.innerHTML;

Возвращает сгенерированный HTML-код, который находится на странице в данный момент.

Для CasperJS вы, вероятно, захотите взглянуть на evaluate() и запустите приведенный выше JavaScript, чтобы получить обновленный HTML.

person Jay    schedule 30.09.2013
comment
Большое спасибо за вашу помощь, Тревор. Да, я все еще пытаюсь понять абстракцию между casperjs и веб-страницей. Я понимаю, что оценка() означает запуск чего-то на странице, но почему я не могу запустить document.body.innerHTML вне оценки()? Каспер ничего не знает о реальной веб-странице? Если да, то почему click() работает вне оценки()? Кстати, веб-страница, полный источник которой я пытаюсь получить: lozo.com/grocery-coupons-bundler - person jpmorris; 01.10.2013
comment
Функция щелчка на самом деле представляет собой оболочку оценки под капотом с некоторыми дополнительными функциями. Если ему не удается щелкнуть элемент в JavaScript (например, оценить), он попытается использовать собственные события QtWebkitEvents для выполнения щелчка (doc). В документации есть текст, который пытается объяснить, как работает оценка. Я согласен, что поначалу немного сложно уложиться в голове. Думайте о CasperJS как о высокоуровневой вещи, которая управляет браузером, и об оценке () как о способе запуска некоторого собственного JS в этом браузере (как в консоли JS). - person Jay; 01.10.2013