我唯一需要做的是,前面的<td>
始终具有相同的(并且对于文档是唯一的)内容:
<td>
<label>unique text<label>
</td>
<td>dynamic text</td>
我可以在浏览器控制台中使用jQuery轻松地抓取它(页面已加载jQuery):
$("label:contains('unique text')").parent().next().text();
我已经有一段时间了,并且尝试了所有我能想到的。
我最近的尝试是使用casperjs的评估和:
casper.thenEvaluate(function addID() {
$("label:contains('unique text')").parent().next().attr('id', 'uniqueID');
});
casper.then(function getText() {
var target = this.getHTML('td#uniqueID');
this.echo(target);
});
这给了我:
CasperError:未找到匹配元素的选择器:td#uniqueID
为什么我的
casper.thenEvaluate
函数没有创建我要寻找的td#uniqueID
?如果我像this post's answer这样:
casper.then(function getText() {
this.evaluate(function addID() {
$("label:contains('unique text')").parent().next().attr('id', 'uniqueID');
});
var target = this.thenEvaluate(function returnText() {
return $('#uniqueID').text();
});
this.echo(target);
});
我得到一个
[Object Casper]
似乎完全是它的样子。它充满了waitForContent
,scrollTo
等。注意:上面的代码块不正确(as was pointed out in this answer by Artjom B.)并更改为:
casper.then(function getText() {
this.evaluate(function addID() {
$("label:contains('unique text')").parent().next().attr('id', 'uniqueID');
});
var target = this.fetchText('#uniqueID');
this.echo(target);
});
问题仍然存在。请参阅下面的答案以获取解决方案。
最佳答案
如果您已经像链接答案中那样尝试过,为什么不复制它呢?您的错误是您在thenEvaluate
块内使用了then
。 CasperJS分步工作,您已计划了不必要的步骤。这将创建另一个步骤,稍后将执行该步骤。
将thenEvaluate
更改为evaluate
,它应该可以正常工作。在进行此操作时,可以将两者结合起来:
casper.then(function getText() {
var target = this.evaluate(function addID() {
$("label:contains('unique text')").parent().next().attr('id', 'uniqueID');
return $('#uniqueID').text();
});
this.echo(target);
});
甚至
casper.then(function getText() {
this.evaluate(function addID() {
$("label:contains('unique text')").parent().next().attr('id', 'uniqueID');
});
var target = this.fetchText(#uniqueID);
this.echo(target);
});