我想编写单元测试,以通过使用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();
});
当我尝试从浏览器的控制台执行相同的代码时,单击了按钮,并弹出了下载窗口。
我最初尝试assertExists
在casperJS中检查按钮是否具有功能。断言通过,表明该按钮存在。另外,inputs数组有2个元素,一个是CSRF令牌的隐藏输入(我正在使用Django),另一个是我要单击的按钮。
PhantomJS(并扩展为CasperJS)具有两个上下文。只有页面上下文(evaluate()
)可以访问DOM。另一个问题是大多数元素未element.click()
在PhantomJS中实现该功能,因此您需要使用另一种类型的click。
CasperJS提供了casper.click()
几乎在所有情况下都可以使用的功能。它可以通过CSS选择器或XPath表达式选择要单击的元素。由于您要单击第二个输入,因此无法定义执行此操作的常规CSS选择器。在这种情况下,必须使用XPath表达式。CasperJS提供了一个XPath实用程序:
var x = require('casper').selectXPath;
...
casper.then(function(){
this.click(x("(//input)[2]"));
});
请注意,在XPath表达式和CSS选择器中,计数从1开始。
当您单击某些内容时,PhantomJS(以及扩展名CasperJS)不会触发文件下载。您将需要自己构建并发送请求。
有很多方法可以做到这一点。这是一个例子。实际上,更好的方法是使用PhantomJS fork,它在新事件中本身支持文件下载。有关更多详细信息,请参见此答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句