【问题标题】:Selecting all nodes CasperJs选择所有节点 CasperJs
【发布时间】:2014-03-12 23:41:11
【问题描述】:

我正在使用 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

我收到了短信,但这对我没有多大帮助。

【问题讨论】:

  • 如果满足某些条件,您始终可以使用 xpath 让 capser 单击包含您提取的文本的链接。

标签: javascript casperjs


【解决方案1】:

你不能从 evaluate () 传回 DOM 元素: casperjs: evaluating document.querySelector returns a nullhttp://casperjs.readthedocs.org/en/latest/modules/casper.html#getelementinfo 仅返回原始类型:对象、数组、布尔值、字符串 .... 你可以做的是:

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2011-06-13
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多