我唯一需要做的是,前面的<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]似乎完全是它的样子。它充满了waitForContentscrollTo等。

注意:上面的代码块不正确(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);
});

09-25 19:17