如何使用CasperJS从此tr中找到的文本中检索tr id

时间:2015-12-03 19:11:50

标签: javascript phantomjs casperjs

今天的这个问题是关于如何从先前在带有CasperJS的tr中找到的文本中检索tr id。

示例 - 以下页面代码: enter image description here

在上面的页面代码中,我们有更多那些带有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?

1 个答案:

答案 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);
});