我有一个链接列表,我必须使用 CasperJS 模拟点击。他们都共享同一个班级。
但是,this.click('.click-me')
只使用第一个链接上的点击。
点击所有链接的正确方法是什么?我在想也许我应该尝试通过获取链接数量,evaluate()
然后使用for
循环。但是,如果我使用evaluate()
链接数量,我必须使用消息进行通信,这似乎很复杂。
有没有更好的办法?
我有一个链接列表,我必须使用 CasperJS 模拟点击。他们都共享同一个班级。
但是,this.click('.click-me')
只使用第一个链接上的点击。
点击所有链接的正确方法是什么?我在想也许我应该尝试通过获取链接数量,evaluate()
然后使用for
循环。但是,如果我使用evaluate()
链接数量,我必须使用消息进行通信,这似乎很复杂。
有没有更好的办法?
我最终使用 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++;
});
});
您显然不必使用重复,但任何迭代技术都应该有效。
正如 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.
混合其他响应,以避免无限循环(这对我有用,因为我的项目在标签内是连续的):
casper.clickWhileSelector = function(selector, i) {
return this.then(function() {
i = i || 1;
selectorNth = selector+':nth-child(' + i + ')';
if (this.exists(selectorNth)) {
this.echo('found link: '+this.getElementInfo(selectorNth).tag);
this.click(selectorNth);
return this.clickWhileSelector(selector, i+1);
}
return this.echo('Done.').exit();
});
}
希望能帮助到你!
路易斯。