2015-12-03 24 views
1

今天的这个问题是关于如何从之前在CasperJS中发现的文本中检索tr id。如何从CasperJS中发现的tr文本中检索tr id

实施例 - 下面页的代码: enter image description here

在上面的页代码我们有更多的那些TR的与ID的“connectedToNeType [0]} _ TR”但从0..15不同的数字。

我的目标是通过文本搜索和查找“ABC_123”的相关ID。 第一部分找到“ABC_123”我有下面的代码管理:

casper.then(function() { 
    var xpath = '//*[contains(text(), "ABC_123")]'; 
    var found = this.evaluate(function(xp) { 
     return __utils__.getElementByXPath(xp); 
    }, xpath); 
    if (found === null) { 
     this.echo("-> NOT FOUND"); 
     this.die(); 
    }; 
    this.echo("FOUND"); 
... 

但我怎么从这点可以得到,并找到根据TR的ID?

回答

2

CasperJS与PhantomJS具有相同的局限性。页面上下文是沙箱,你只能传入和传出原始对象。 DOM节点不是原始对象,这就是为什么它返回为null。见documentation

注:参数和返回值的evaluate功能必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那么它很好。

闭包,功能,DOM节点等将不是工作!

你必须返回一个表示您感兴趣的元素。如果你不能做到这一点,那么你必须做的所有工作在页面上下文。

看起来你想要选择<tr>元素,它是包含文本的<td>元素的父元素。 XPath支持与来自..的孩子匹配。你可以简单地这样做:

casper.then(function() { 
    var xpath = '//td[contains(text(), "ABC_123")]/..'; 
    var foundId = this.evaluate(function(xp) { 
     return __utils__.getElementByXPath(xp).id; 
    }, xpath); 
    if (foundId == null) { 
     this.echo("-> NOT FOUND"); 
     this.die(); 
    }; 
    this.echo("FOUND: " + foundId); 
}); 

或与其他功能:

var x = require("casper").selectXPath; 
... 
casper.then(function() { 
    var xpath = '//td[contains(text(), "ABC_123")]/..'; 
    var foundId = this.getElementAttribute(x(xpath), "id"); 
    if (foundId == null) { 
     this.echo("-> NOT FOUND"); 
     this.die(); 
    }; 
    this.echo("FOUND: " + foundId); 
}); 
+0

我也许会错过一些东西,我想第一个代码示例,它给了我一个空值(未_null_)为'foundId' (在'this.echo(“FOUND:”+ foundId);')行! – FotisK

+0

我之前没有在您的标记中找到文本(ABC_123),所以我认为您感兴趣的节点与具有您正在使用的文本的节点相同。现在我找到了文本。请记住,XPath中的text()仅查看当前上下文节点的子文本节点。它没有看到它的孩子的孩子,这就是为什么我的第一个建议不起作用。 –