【问题标题】:Finding elements using __utils__.getElementsByXPath in CasperJS在 CasperJS 中使用 __utils__.getElementsByXPath 查找元素
【发布时间】:2015-02-20 17:51:34
【问题描述】:

我的 casper.js 测试脚本中的 sn-p 如下所示;

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);
});

在评估函数内部,我试图获取对如下所示的 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>

在 Google Chrome (Ctrl+F) 中,我测试了 xpath,发现引用正确。但是当我执行 casperjs 脚本时,我得到的输出 require('utils').dump(eobject)[]this.echo(eobject) 为空白。有人知道可能是什么问题吗?

【问题讨论】:

    标签: javascript xpath phantomjs casperjs


    【解决方案1】:

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

    注意:评估函数的参数和返回值必须是简单的原始对象。经验法则:如果可以通过 JSON 序列化就可以了。

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

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

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

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

    而不是

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

    您的 XPath 表达式过于复杂,甚至可能容易出错。这个可能更好:

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

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多