单击与选择器匹配的所有链接

时间:2013-01-29 22:46:02

标签: casperjs

我有一个链接列表,我必须使用CasperJS模拟点击。他们都属于同一个班级。

但是,只使用this.click('.click-me')点击第一个链接。

点击所有链接的正确方法是什么?我想也许我应该尝试通过evaluate()获取链接数量,然后使用for循环。但是,如果我使用evaluate()链接的数量,我必须使用消息进行通信,这似乎很复杂。

有更好的方法吗?

3 个答案:

答案 0 :(得分:15)

我最终使用nth-child()选择器来完成此任务。这是怎么......

页:

<ul id="links">
  <li><a href="#1">1</a></li>  
  <li><a href="#2">2</a></li>  
  <li><a href="#3">3</a></li>  
</ul>

脚本:

casper.then(function() {
  var i = 1;
  this.repeat(3, function() {
    this.click('#links li:nth-child(' + i + ') a');
    i++;
  });
});

你显然不必使用重复,但任何迭代技术都应该有用。

答案 1 :(得分:8)

正如CasperJS ML和记录中所提出的,这是clickWhileSelector的可能实现:

var casper = require('casper').create();

casper.clickWhileSelector = function(selector) {
    return this.then(function() {
        if (this.exists(selector)) {
            this.echo('found link: ' + this.getElementInfo(selector).tag);
            this.click(selector);
            return this.clickWhileSelector(selector);
        }
        return this.echo('Done.').exit();
    });
}

casper.start().then(function() {
    this.page.content =
        '<html><body>' +
        '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 1</a>' +
        '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 2</a>' +
        '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 3</a>' +
        '</body></html>';
});

casper.clickWhileSelector('a').run();

这给出了:

$ casperjs c.js
found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 1</a>
found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 2</a>
found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 3</a>
Done.

答案 2 :(得分:1)

混合其他响应,以避免无限循环(这对我有效,因为我的项目在标签内是连续的):

    <body ng-app='myApp'>

希望它有所帮助!

路易斯。