【问题标题】:Find an element on the page based on a variable using CasperJS' getElementByXPath使用 CasperJS 的 getElementByXPath 根据变量在页面上查找元素
【发布时间】:2015-04-15 07:51:18
【问题描述】:

我在使用带有可变 xpath 参数的 __utils__.getElementByXPath() 时遇到问题,请参见示例:

licid 在 cli 执行脚本时以 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 not found”! 但是当我改变返回线时:

return __utils__.getElementByXPath('//*[contains(text(), "FAT32")]');

这会给我“找到 Lic”,这是正确的!

我必须如何使用__utils__.getElementByXPath() 中的 licid 才能使该行更通用?

【问题讨论】:

    标签: javascript xpath casperjs


    【解决方案1】:

    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 节点等将起作用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多