我在使用带有变量xpath参数的__utils__.getElementByXPath()
时遇到问题,请参阅示例:
在cli执行脚本时,licid以argv(--licid=FAT32
)的形式给出,并且正确地从CasperJS中确认。
casper.then(function() {
var xpath_lic = '//*[contains(text(), "' + casper.cli.get("licid") + '")]';
this.echo('searching for...' + xpath_lic);
var found = this.evaluate(function() {
return __utils__.getElementByXPath(xpath_lic);
});
if (found) {
this.echo('Lic found');
}
else {
this.echo('Lic not found');
}
});
以上代码始终打印出来"未找到Lic"! 但当我用:
更改返回行时return __utils__.getElementByXPath('//*[contains(text(), "FAT32")]');
这将给我" Lic找到"这是正确的!
我如何使用__utils__.getElementByXPath()
中的licid使线更通用?
答案 0 :(得分:2)
casper.evaluate()
是沙盒页面上下文(源自PhantomJS' page.evaluate()
)。它无法访问在其外部定义的变量。你必须明确地传递它们:
var xpath_lic = '//*[contains(text(), "' + casper.cli.get("licid") + '")]';
var found = this.evaluate(function(xp) {
return !!__utils__.getElementByXPath(xp); // convert to boolean with `!!`
}, xpath_lic);
您无法将DOM节点传递出页面上下文,因此您需要获取它们的表示形式,如element.textContent
或完全在页面上下文中工作。
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!