使用document.querySelectorAll获取CasperJS的textContent

Ana*_*ist 3 javascript selectors-api phantomjs casperjs

我正在使用CasperJS自动填写在线表格.每当您尝试提交填写了包含无效数据的任何必填字段的表单时,每个包含无效数据的字段都会显示一条错误消息,提醒您问题所在.我想收集所有这些消息并将它们连接成一个 - 无论是通过数组还是其他方法对我来说都无关紧要.错误消息的CSS如下所示:

<span class="field-validation-error" data-valmsg-replace="true" data-valmsg-for="Name.Last">
    <span class="" for="Name_Last" generated="true">
        The Last Name field is required.
    </span>
</span>
Run Code Online (Sandbox Code Playgroud)

<span class="field-validation-error" data-valmsg-replace="true" data-valmsg-for="Address.City">
    <span class="" for="Address_City" generated="true">
        The City field is required.
    </span>
</span>
Run Code Online (Sandbox Code Playgroud)

在浏览器控制台中,我成功地做到了这一点:

var arr = document.querySelectorAll('.field-validation-error');
for (var i = 0; i < arr.length; i++) { 
    var err = arr[i]; console.log(err.textContent);
}
Run Code Online (Sandbox Code Playgroud)

它让我回复:

"The Last Name field is required."
"The City field is required."
Run Code Online (Sandbox Code Playgroud)

我打算在CasperJS中做同样的事情,但我无法得到相同的结果.这是我的代码到目前为止(一个更大的文件的片段,所以我不会发布我casper.start或任何东西):

var results = self.evaluate(function() {
    var arr =  document.querySelectorAll('.field-validation-error');
    return Array.prototype.map.call(arr, function(e) {
        return e.getAttribute('textContent');
    });
});

for (var i = 0; i < results.length; i++) {
     console.log(results[i]);
}
Run Code Online (Sandbox Code Playgroud)

这输出三个空行.如果我只是return e然后console.log(results[i].textContent)),脚本会正确打印一个错误消息,但随后崩溃,因为数组的其余部分充满了空对象!我以为Array.prototype.map应该阻止这个?如何通过Casper从此页面中获取错误消息数组?

Art*_* B. 6

您应该能够使用本机CasperJS函数执行此操作getElementsInfo.它包含text每个元素的属性:

var texts = casper.getElementsInfo('.field-validation-error').map(function(info){
    return info.text.trim();
});
Run Code Online (Sandbox Code Playgroud)

e.getAttribute('textContent')显然无法工作,因为没有textContent属性,只有textContent属性.您在浏览器控制台中使用的相同代码应该在PhantomJS中使用.您可以尝试更改.textContent.innerText.