在 CasperJS 中使用 __utils__.getElementsByXPath 查找元素

Finding elements using __utils__.getElementsByXPath in CasperJS

本文关键字:utils getElementsByXPath 查找 元素 CasperJS      更新时间:2024-02-09

下面给出了我的 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);
});

在评估函数中,我试图获取对 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)为空白。有没有人知道可能是什么问题?

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

注意:求值函数的参数和返回值必须是简单的基元对象。经验法则:如果可以通过 JSON 序列化,那就没问题了。

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

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

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

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

而不是

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

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

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