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

Производительность phantom.js vs zombie.js

Я оцениваю phantom.js и зомби .js. Я ожидал, что компромисс будет заключаться в том, что phantom поддерживает более широкие документы (поскольку он использует реальный рендерер), в то время как зомби работает быстрее (поскольку не используется движок рендеринга). Однако зомби кажется намного медленнее в тесте, который я сделал. Имеет ли это смысл?

Я думаю, может быть, зомби ждет полной страницы для загрузки, прежде чем visit() вернется (включая запуск всех скриптов и загрузку css), в то время как phantom возвращает сразу после запуска() (я использовал casperjs), позволяя мне продолжать, не дожидаясь для полной страницы.

phantom.js

casper.userAgent("Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13");

casper.test.begin('bing search', 2, function(test) {
    casper.start('http://www.bing.com/', function() {
        this.waitUntilVisible('#sb_form_q', function() {
            this.sendKeys('#sb_form_q', "book", true);
            this.click('#sb_form_go');
            this.waitUntilVisible('#count', function() {        
                var val = this.evaluate(function() {
                     return document.getElementById('count').innerText
                });

                console.log(val)
            });
        });
    }).run(function() {
        test.done();
    });
});

Zombie.js

var Browser = require("zombie");
var browser = new Browser()

browser.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13"

browser.visit("http://www.bing.com/", function() {
    browser.fill("#sb_form_q", "book");
    browser.pressButton("#sb_form_go");

    function resultArrived(window) {
        return window.document.querySelector("#count")
    }

    browser.wait(resultArrived, function() {
        console.log(browser.document.querySelector("#count").innerHTML)               
    });
});
4b9b3361

Ответ 1

Я не уверен, почему вы не используете синтаксис promises зомби (как вы это делаете с casper)? Вы должны делать что-то вроде:

browser.fill(...)
   .then(browser.pressButton)
   .then(something else)

не использующий синтаксис promises, может вызывать все виды странных эффектов, поскольку порядок выполнения в async api отличается от кода сверху вниз, к которому вы привыкли в языках script.

для вашего вопроса, я не могу быть полностью уверен, но из моего опыта zombie.js и capser.js(поверх phantom.js) довольно схожи по скорости. Также обратите внимание, что zombie.js docs заявляют, что:

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

Поскольку вы выполняете обратный вызов, вы получаете то, что ожидаете, - ожидая полной загрузки страницы.