在CasperJS中使用__utils __。getElementsByXPath查找元素

时间:2015-02-20 17:51:34

标签: javascript xpath phantomjs casperjs

我的casper.js测试脚本的片段如下所示;

var refObject = undefined;

casper.then(function() {
  refObject = this.evaluate(function() {
    return __utils__.getElementsByXPath('//div[contains(concat(" ", @class, " "), " refObject ")]//a[contains(normalize-space(text()), normalize-space("SampleTest"))]//../../../..');
  });
  require('utils').dump(refObject);
  this.echo(refObject);
  test.assertTruthy(refObject);
});

这里面的evaluate函数我试图引用一个看起来如下的html元素;

<div class="refObject">
    <div class="accordion-heading">
        <div class="accordion-toggle">
            <div class="btn-group">
                <a class="dropdown-toggle" data-toggle="dropdown">SampleTest</a>
            </div>
        </div>
    </div>
</div>

在谷歌浏览器(Ctrl + F)中,我测试了xpath并发现它正确引用。但是当我执行casperjs脚本时,我将require('utils').dump(eobject)的输出[]this.echo(eobject)视为空白。有没有人知道可能是什么问题?

1 个答案:

答案 0 :(得分:2)

这是PhantomJS的问题。您不能将DOM元素从页面上下文传递到外部。你必须有一些原始的表示。

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等不起作用!

您可以通过返回数组的长度而不是实际列表来检查这是否是问题。

另一个问题可能是匹配a元素后的子搜索。使用

normalize-space("SampleTest"))]/../
-------------------------------^

而不是

normalize-space("SampleTest"))]//../

您的XPath表达式不必要地复杂,甚至可能容易出错。这个可能更好:

//div[contains(concat(" ", @class, " "), " refObject ") and .//a[contains(text(), "SampleTest")]]