2

これが私がやろうとしていることです:

var casper = require('casper').create();

casper.start('mysite.html', function() {
});

/* Casper configuration */

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
})

function getAllImages()
{
    // Get all images
    var images = document.getElementsByTagName('img'); 
    evaluateImages(images);
}

function evaluateImages(images)
{
    console.log("I am in evaluateImages");
}

// Then find all pictures
casper.then(function() {
    var product_image = this.evaluate(getAllImages);
});

casper.run();

しかし、それは決して evaluteImages 関数にはなりません。ここで何が欠けていますか?

4

1 に答える 1

4

まあ、私は CasperJS を使用したことはありませんが、ドキュメントで読んだことから、evaluateImages関数がページのコンテキストに存在しないためだと思います。

ここで何がベストプラクティスなのかはわかりませんが、評価コールバックからプリミティブを返すことができるようですので、技術的には次のようにすることができます:

function getAllImages() {
    // Get all images
    var images = document.getElementsByTagName('img');

    //Return an array that contains all images src attribute
    return Array.prototype.map.call(images, function (img) {
        return img.src;
    });
}

次に、次のようなことができます。

var images = this.evaluate(getAllImages);

evaluateImages(images);

編集:

それぞれの画像をページ内の他の要素と比較しているため、すべての画像をページ コンテキストで処理する必要があります...

おそらく、最初にページのコンテキストでモジュールを定義できます。

this.evaluate(function () {
    window.yourNS = {
        evaluateImages: function (images) {
            //do something with images
        },
        getAllImages: function () {
            return document.getElementsByTagName('img');
        }
    };
});

次に、次のようなことができます。

this.evaluate(function () {
    yourNS.evaluateImages(yourNS.getAllImages());
});
于 2013-10-11T17:17:32.420 に答える