4

在过去的几个小时里,我一直在尝试查询 DOM 元素并使用 CasperJS 将它们存储在一个数组中,所以在那之后,我可以遍历它们并触发一个 click 事件。

比方说,我的标记是这样的:

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

现在,我想存储每个<li>数组,然后循环,触发 Click 事件,然后进行捕获。

这是我尝试过的事情之一:

var listItems = [];

casper.start();

casper.open(urlHere, function () {
    listItems.push(this.evaluate(function () {
        return document.querySelectorAll('ul > li');
    }));

    this.echo(listItems);
});

它返回[ , , , ],这基本上意味着它们都是null.

有人可以指导我正确的方向吗?

谢谢!

4

2 回答 2

10

尝试这个:

var listItems = [];

casper.start(urlHere, function () {
    listItems = this.evaluate(function () {
        var nodes = document.querySelectorAll('ul > li');
        return [].map.call(nodes, function(node) {
            return node.textContent;
        });
    });

    this.echo(listItems);
});     

基本上,您不能从 中返回不可序列化的值,文档中this.evaluate()对此进行了很好的解释

于 2013-04-30T20:32:30.463 回答
1

我对 CasperJS 一无所知,但数组在 JavaScript 中被视为对象,因此数组将具有 Object 类型。您是否尝试过使用 for 循环遍历它?

var i;
for(i=0;i<listItems.length;i++) {
    var item = listItems[i];
}

或者,如果您有一个包含列表项对象的实际对象,您可以执行以下操作:

for(i in listItems) {
    if(listItems.hasOwnProperty(i)) { 
        var item = listItems[i];
    }
}

编辑:这只是为了检查您是否确实有一个包含您的项目的有效数组。

于 2013-04-30T13:29:04.103 回答