首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Casperjs:“如果在另一个文件中使用TypeError(),则”未定义的“不是函数”

Casperjs:“如果在另一个文件中使用TypeError(),则”未定义的“不是函数”
EN

Stack Overflow用户
提问于 2014-12-07 09:40:49
回答 1查看 2.5K关注 0票数 1

使用casperjs1.1.0-beta3和幻影1.9.8的代码列表如下:

代码语言:javascript
复制
function getImage(locator, casper) {

return casper.evaluate(function(locator) {
    return Array.prototype.map.call(document.querySelectorAll(locator), function(e) {
        return e.getAttribute('src');
    });
},locator);

};    

casper.start("http://stackoverflow.com/", function () {

    var img = getImage('img[class="sponsor-tag-img"]', this);
    this.echo(img[0]);
    this.download(img[0], "logo.png");   

});

casper.run();

但是,如果我将代码分成两个文件并从另一个文件调用util.getImage(),则会出现以下错误:~/tmp/PhantomCSS $ casperjs test --web-security=no demo/stack.js

代码语言:javascript
复制
FAIL TypeError: 'undefined' is not a function (evaluating 'util.getImage('img[class="sponsor-tag-img"]', this)')
#    type: uncaughtError
#    file: demo/stack.js:5
#    error: 'undefined' is not a function (evaluating 'util.getImage('img[class="sponsor-tag-img"]', this)')
#           TypeError: 'undefined' is not a function (evaluating 'util.getImage('img[class="sponsor-tag-img"]', this)')
#               at demo/stack.js:5
#               at runStep (/usr/local/lib/node_modules/casperjs/modules/casper.js:1553)
#               at checkStep (/usr/local/lib/node_modules/casperjs/modules/casper.js:399)
#    stack: not provided

stack.js:

代码语言:javascript
复制
var util = require('/home/gauss/tmp/PhantomCSS/demo/util.js');

casper.start("http://stackoverflow.com/", function () {

    var img = util.getImage('img[class="sponsor-tag-img"]', this);
    this.echo(img[0]);
    this.download(img[0], "logo.png");   

});

casper.run();

util.js:

代码语言:javascript
复制
function getImage(locator, casper) {

    return casper.evaluate(function(locator) {
        return Array.prototype.map.call(document.querySelectorAll(locator), function(e) {
            return e.getAttribute('src');
        });
    },locator);

};

怎么修呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-07 11:43:17

这不是require的工作方式。它非常类似于node.js类型的要求。

你有两种可能性。有关更多信息,请参见文档

module.exports

util.js:

代码语言:javascript
复制
function getImage(locator, casper) {
    // impl
}
module.exports = getImage;

stack.js:

代码语言:javascript
复制
var getImage = require('util'); // extension can be omitted
// use getImage(locator, casper)

这种类型最适合于类函数或将全局对象传递给所有函数,而不是实用程序函数的集合。一个备选案文是:

util.js:

代码语言:javascript
复制
function getImage(locator, casper) {
    // impl
}
module.exports = function(casper){
    return {
        getImage: function(locator){
            return getImage(locator, casper)
        }
    };
};

stack.js:

代码语言:javascript
复制
var util = require('util')(casper); // extension can be omitted
// use util.getImage(locator)

exports

util.js:

代码语言:javascript
复制
function getImage(locator, casper) {
    // impl
}
exports.getImage = getImage;

stack.js:

代码语言:javascript
复制
var getImage = require('util'); // extension can be omitted
// use getImage(locator, casper)

顺便说一下,您的getImage实用程序函数已经在CasperJS中作为getElementsAttribute提供了。

代码语言:javascript
复制
casper.getElementsAttribute(locator, "src");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27341395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档