单击按钮使用 CasperJS 下载文件

Click a button to download a file using CasperJS

我想编写单元测试,通过使用 casperJS 单击表单按钮来下载文件。我尝试使用 document.getElementsByTagName 找到按钮并以 JavaScript 的方式单击它。但是我收到一条错误消息:

TypeError: 'undefined' is not a function (evaluating 'inputs[1].click()')

未通过测试的代码段:

casper.then(function() {
    var inputs = document.getElementsByTagName('input');
    inputs[1].click();
});

当我尝试从浏览器的控制台执行相同的代码时,单击按钮并弹出下载 window。

我最初尝试检查 casperJS 中是否存在具有 assertExists 功能的按钮。断言通过,表明按钮存在。此外,输入数组有 2 个元素,一个是 CSRF 令牌的隐藏输入(我使用的是 Django),另一个是我要单击的按钮。

点击

PhantomJS(以及扩展名 CasperJS)有两个上下文。只有页面上下文 (evaluate()) 可以访问 DOM。另一个问题是大多数元素在 PhantomJS 中没有实现 element.click() 功能,因此您需要使用其他类型的点击。

CasperJS 提供了一个 casper.click() 函数,几乎适用于所有情况。它可以 select 您想要通过 CSS select 或 XPath 表达式单击的元素。由于您要单击第二个输入,因此无法定义一般的 CSS select 或执行此操作的。在这种情况下必须使用 XPath 表达式。 CasperJS 提供了一个 XPath 实用程序:

var x = require('casper').selectXPath;
...
casper.then(function(){
    this.click(x("(//input)[2]"));
});

请注意,XPath 表达式中的计数从 1 开始,CSS select 或


正在下载

PhantomJS(以及扩展名 CasperJS)不会在您单击某些内容时触发文件下载。您需要自己构建和发送请求。

有很多方法可以做到这一点。 Here is one example. Actually, a better way would be to use a PhantomJS fork that natively supports file downloading as part of a new event. See this answer了解更多详情。