选择所有节点CasperJs

时间:2014-03-08 01:07:32

标签: javascript casperjs

我正在使用CasperJS自动化一些网络内容。我想在列表中选择所有li,并根据其中包含的信息从该列表中选择一个特定的li。然后,我想点击所选li中的链接。到达我想要的页面后,我有以下代码:

casper.then(function() {
  var nodes = this.evaluate(function(){
    var li_nodes = document.querySelectorAll('ul#merchants li');
    return Array.prototype.map.call(lis, function(e) {
      return e;
    });
  });
});

但这并没有让我回到一系列节点。如果相反,我有:

return e.innerText

我收回了文字,但这对我没什么帮助。

1 个答案:

答案 0 :(得分:0)

您无法从evaluate()传回DOM元素: casperjs: evaluating document.querySelector returns a nullhttp://casperjs.readthedocs.org/en/latest/modules/casper.html#getelementinfo 只返回基本类型:object,array,boolean,string .... 你能做的是:

this.click("ul#merchants li:nth-child(3)");

请参阅儿童等的css选择器......:http://www.w3schools.com/cssref/css_selectors.asp

或者像Chris说的那样,使用XPath选择器:

var x = require('casper').selectXPath;
this.click(x("//ul[@id='merchants']//li[3]"));

使用某些文字内容进行过滤:

this.click(x("//ul[@id='merchants'][contains(text(),'someText')]//li[3]"));

我们没有"包含文字"在css3选择器中,所以当我想用css选择器做的时候,我用jQuery(:contains())来做。 (如果需要,你需要注入jQuery客户端) 或者使用this.clickLabel(" text");