querySelectorAll无法识别var

时间:2015-04-18 18:26:48

标签: javascript casperjs

我正在使用casperjs进行一些webscraping并且遇到了一个奇怪的问题。 我希望能够从字符串构造一个CSS路径并使用" querySelectorAll'来获取一个数组。如下所示:

var tier = '-ou-';
var index = 'div.list > div > a[href*="' + tier + '"]';
var battles = document.querySelectorAll(index);

但是,这不起作用,并且战斗返回null。

此版本有效:

var links = document.querySelectorAll('div.list > div > a[href*="-ou-"]');

但没有其他人这样做。 我也尝试过:

var index = 'div.list > div > a[href*="-ou-"]';
var battles = document.querySelectorAll(String(index));

var index = 'div.list > div > a[href*="-ou-"]';
var battles = document.querySelector(index);

以及上述的所有组合,正如完整性检查一样,没有效果。我对javascript相对较新,所以我觉得我可能会遗漏一些明显的东西,但我不知道是什么。

编辑: 我的整个计划如下。它是正常的。如果使用getBattles中的注释行而不是下面的注释行,它将不再起作用(var' wartles'变为null)

var casper = require('casper').create();
var url = 'http://play.pokemonshowdown.com/';
var battles = [];
var tier = '-ou-';
var index = "div.list > div > a[href*=\"" + tier + "\"]";

function getBattles() {
    //var battles = document.querySelectorAll(index);
    var battles = document.querySelectorAll('div.list > div > a[href*="-ou-"]');
    return Array.prototype.map.call(battles, function(e) {
        return e.getAttribute('href');
    });
}

casper
  .start(url)
  .then(function() {
    if(this.exists('div.leftmenu')) {
      this.echo('something works');
    }
    else {
      this.echo('nothing works');
    }
  })
  .thenClick('button[name="roomlist"]')
  .then(function(){
    this.echo("This one is done.");
  })
  .waitForSelector('div.list > div > a', function(){
    battles = this.evaluate(getBattles);
    this.echo(this.getHTML('div.list > div:nth-child(2) > a'));
  })
  .then(function(){
    this.echo("This two is done.");
  });

casper.run(function() {

    this.echo(battles.length + ' battles found:');
    this.echo(' - ' + battles.join('\n - ')).exit();
});

1 个答案:

答案 0 :(得分:2)

CasperJS和PhantomJS有两种情境。通过casper.evaluate()编程的内部上下文是沙箱。这意味着它无法访问外部定义的变量。您需要在:

中明确传递这些变量
var index = 'div.list > div > a[href*="' + tier + '"]';

function getBattles(innerIndex) {
    var battles = document.querySelectorAll(innerIndex);
    return Array.prototype.map.call(battles, function(e) {
        return e.getAttribute('href');
    });
}
...
battles = casper.evaluate(getBattles, index);

evaluate()的PhantomJS文档有一个重要的注意事项:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!