javascript - CasperJS/PhantomJS 获取节点并单击它们

标签 javascript phantomjs casperjs

我正在尝试获取 DOMElements 并单击每个元素。之后我想对响应运行断言。

var nodes = this.evaluate(function(){
    var nodes = document.querySelectorAll('.editable .action');
    return nodes;
});

//Print the base URI for the node
for (i = 0; i < nodes.length; ++i) {
    if(null != nodes[i]){
        require('utils').dump(nodes[i].baseURI);
    }
}

我有大约 5 个匹配的节点,但节点 [0] 是唯一不为空的节点。其余的在 CasperJS 中都是 null。然而,在 Chrome 浏览器中运行相同的测试,我得到了所有节点,没有一个为空。

最佳答案

CasperJS 是基于 PhantomJS 构建的,并且具有相同的限制。这些限制之一是有两个上下文,并且可以访问 DOM 的页面上下文是沙箱的。无法将 DOM 节点等非原始对象传递到页面上下文之外。

Documentation :

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

您无法将此与 Chrome 进行比较,因为 Chrome 在正常操作中没有两个上下文。

您可以将 DOM 节点的表示传递到页面上下文之外。 CasperJS 为此提供了一些便利的功能,例如 casper.getElementsInfo(selector) .

如果您想单击每个元素,则可以通过不同的方法来实现此目的,具体取决于元素在页面上的定位方式。我的回答here显示了在页面上下文之外使用 CSS 选择器和 XPath 表达式的两种方法。

另请参阅:

关于javascript - CasperJS/PhantomJS 获取节点并单击它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33482600/

相关文章:

javascript - 如何显示进度条直到加载整个 aspx 页面?

javascript - Bootstrap 4 - 附加侧边栏时无法保持相同的宽度

javascript - 将 div 的高度降低一定数量?

javascript - 使用 PhantomJs 和 CasperJs 注入(inject) Js

selenium - 如何将 PhantomJS 路径传递给 Selenium Grid

javascript - Casperjs,如何仅在收到ajax调用的响应后继续

javascript - Backbone 事件哈希与 jquery 事件声明

javascript - 无法访问 HTTP 响应中的自定义 header

javascript - 如何多次调用 casper.start()

javascript - CasperJS,使用javascript禁用来抓取目标页面中的内容