【问题标题】:CasperJS & ObjectCasperJS 和对象
【发布时间】:2015-06-26 18:30:43
【问题描述】:

我正在尝试创建一个 article 对象构造函数,该构造函数包含文档标题、作者等属性,并根据我传递给它的不同 URL 使用创建对象实例。在下面的示例中,this.articleText 应该返回一个字符串数组,但它什么也不返回。

这与this.headlineText 形成对比,后者按预期返回字符串hello

鉴于这种差异,我怀疑问题的根本原因是构造函数中使用了document 对象。但是,输出中没有抛出任何错误,那么我应该如何解决这个问题?

非常感谢任何建议。 (css选择器本身没有问题;如果我使用函数来获取文章字符串,那么这似乎可行。问题在于尝试使用对象解析数据时)

var fs = require('fs');
var casper = require("casper").create({
    verbose: true,
    logLevel: "debug"
});

function article(title, url) {
    this.headlineText = title;
    this.urlString = url;
    var query = document.querySelectorAll("[itemprop='articleBody']");

    this.articleText = Array.prototype.map.call(query, function (e) {
        return e.innerText;
    });
}


casper.start("http://www.yomiuri.co.jp/economy/20150625-OYT1T50136.html" ,     function() {
    this.test.assertExists({
        type: 'css',
        path: '[itemprop="articleBody"]'
    }, 'Article Exists');
});


casper.run(function() {
    var test1 = new article("hello","http://www.yomiuri.co.jp/economy/20150625-OYT1T50136.html");

    console.log("HEADLINE==");
    console.log(test1.headlineText); // returns "hello"

    console.log("ARTICLE == ");
    console.log(test1.articleText); // returns nothing

    this.exit();
});

【问题讨论】:

    标签: javascript casperjs


    【解决方案1】:

    关于如何访问页面的文档对象存在误解。 您必须使用评估,因为所有页面调用都在沙箱中执行:

    CasperJS evaluate()

    所以你将不得不调用评估,并从它返回你的 querySelectorAll,然后将它传递给你的函数:)

    祝你好运

    【讨论】:

    • 是的 - 程序的结构与 selenium 完全不同,这让我很头疼......我已经重写了这个来调用 casper.then(function(){... });
    【解决方案2】:

    当你想运行特定于 javascript 的代码时,你必须使用evaluate 函数来运行它,这些函数在沙箱中执行。

    你想写这样的东西

    casper.then(function() {
            var a = this.evaluate(article(title, url),{title:'hello',url:'url'});
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多