如何获取在casperjs中动态创建的图像的img src?

时间:2013-12-26 09:23:03

标签: image dynamic casperjs

以下代码获取站点中存在的所有图像,并检查图像是否已加载到casperjs中。问题是我无法获得在运行时动态创建的图像。我怎么做?。任何帮助都将不胜感激。

1)以下代码获取静态图像,而不是获取在运行时创建的图像。

var imagesArray = [];

function getImages() {
    var scripts = document.querySelectorAll('img[src]');
    return Array.prototype.map.call(scripts, function (e) {
        return e.getAttribute('src');
    });
};

casper.start(url, function () {
    imagesArray = this.evaluate(getImages);
    var self = this;
    imagesArray.forEach(function (item) {
        if (self.resourceExists(item)) {
            self.echo(item + ' loaded');
        } else {
            var message = item + ' not loaded';
            self.echo(message, 'ERROR');
        }
    });
});

casper.run(function() {this.test.renderResults(true);});

2)我也尝试使用waitForselector,但它没有用。它说“等待超时发生且测试用例失败”。请参阅以下代码

var imagesArray = [];

function getImages() {
    var scripts = document.querySelectorAll('img[src]');
    return Array.prototype.map.call(scripts, function (e) {
        return e.getAttribute('src');
    });
};

casper.start(url);
casper.waitForSelector('.card-container', function() {
console.log("hi");
imagesArray = this.evaluate(getImages);
    var self = this;
    imagesArray.forEach(function (item) {
                if(self.resourceExists(item)) {
            self.echo(item + ' loaded');
        } else {
            var message = item + ' not loaded';
            self.echo(message, 'ERROR');
        }
    });
});


casper.run(function() {
    this.echo('Image loading test finished');
    this.exit();
});

3 个答案:

答案 0 :(得分:2)

您获取图像源的功能看起来很好 - 问题显然是它在页面被修改之前运行。尝试识别页面是否被修改(尝试不同的选择器,检查Casper.options.pageSettings是否允许脚本执行其工作)。

casper.start(url);
casper.waitForSelector('.sticky-menu-active', function() {
    this.echo('...found selector ...try getting image srcs now...');
}, function() {
   this.echo('even after 10secs not found it - some scripts failed to execute on casperjs/phantomjs ?');
}, 10000);
casper.run(function() {
    this.echo('test finished');
    this.exit();
});

答案 1 :(得分:1)

eachwaitFor的文档。这可能会有所帮助(未经测试):

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

var images = [];

casper.GetImages = function() {
    images = this.evaluate(function() {
        var scripts = document.querySelectorAll('img[src]');
            return Array.prototype.map.call(scripts, function (e) {
                return e.getAttribute('src');
        });
    });
    this.echo('** Successfully got the images... **');
    return true;
};

casper.start(url);

casper.then(function() {
    this.echo('** Getting the images... **');
    this.waitFor(function check() {
        return this.GetImages;
    });
    this.each(images, function(self, image) {
        this.echo('Item loaded: ' +  image);
    });
});

casper.run(function() {
    this.echo('** All done... **');
    this.exit();
});

答案 2 :(得分:1)

您可以尝试在pageLoadFinsihed上执行此操作。请尝试以下代码(未经测试)

var imagesArray = [];

function getImages() {
    var scripts = document.querySelectorAll('img[src]');
    return Array.prototype.map.call(scripts, function (e) {
        return e.getAttribute('src');
    });
};

casper.start(url);
casper.on('load.finished', function () {
console.log("hi");
imagesArray = this.evaluate(getImages);
    var self = this;
    imagesArray.forEach(function (item) {
                if(self.resourceExists(item)) {
            self.echo(item + ' loaded');
        } else {
            var message = item + ' not loaded';
            self.echo(message, 'ERROR');
        }
    });
});


casper.run(function() {
    this.echo('Image loading test finished');
    this.exit();
});