使用CasperJS'getElementByXPath基于变量在页面上查找元素

时间:2015-04-15 07:51:19

标签: javascript xpath casperjs

我在使用带有变量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使线更通用?

1 个答案:

答案 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节点等将工作!