今天的这个问题是关于如何从先前在带有CasperJS的tr中找到的文本中检索tr id。
在上面的页面代码中,我们有更多那些带有id “connectedToNeType [0]} _ TR”的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?
答案 0 :(得分: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);
});