我的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)
视为空白。有没有人知道可能是什么问题?
答案 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")]]