我正在尝试获取 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 节点等非原始对象传递到页面上下文之外。
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/