javascript - 使用 CasperJS 中的 XPath 查询获取所有表行并返回它们

标签 javascript xpath casperjs

我正在使用 Casper.js 自动执行定期上传。我已经设法上传文件并检查它是否有效,但我想解析如果有错误则返回的表,但我收到错误 [error] [remote] findAll(): invalid selector提供“[object Object]”:错误:SYNTAX_ERR:DOM 异常 12。这是我的代码的相关部分:

casper.then(function() {
    if (this.fetchText('.statusMessageContainer').match(/Sorry, the file did not pass validation. Please review the validation errors in the report below/)) {
        this.echo("Upload failed!", "ERROR");
        errors = this.evaluate(function() {
            var errorRows = __utils__.findAll({
                type: 'xpath',
                path: '//table[@id="uploadTable"]/tr[position()>1]'
            });
            return Array.prototype.forEach.call(errorRows, function(e) {
                return e;
            });
        });
        this.echo(JSON.stringify(errors));
    } else {
        this.echo("Upload successful", "INFO");
    }
});

有什么想法吗?

最佳答案

虽然您可能有 XPath 语法错误,但您必须知道您不能从传递给 evaluate() 方法的闭包中返回 DOM 元素;你必须将你的 NodeListHTMLelement 实例转换为一些原生的 Javascript 类型,例如。数组、对象、字符串等……

此外,还有一个方便的 getElementsByXPath() method in the ClientUtils module您可以使用 __utils__ 实例自动注入(inject)到您加载的每个页面中:

casper.then(function() {
    if (this.fetchText('.statusMessageContainer').match(/Sorry, the file did not pass validation. Please review the validation errors in the report below/)) {
        this.echo("Upload failed!", "ERROR");
        var errors = this.evaluate(function() {
            var errorRows = __utils__.getElementsByXPath('//table[@id="uploadTable"]/tr[position()>1]');
            return Array.prototype.map.call(errorRows, function(e) {
                return e.innerText; // let's get node text instead of HTMLelement!
            });
        });
        this.echo(JSON.stringify(errors));
    } else {
        this.echo("Upload successful", "INFO");
    }
});

您还可以使用 ClientUtils bookmarklet也可以在浏览器控制台中测试您的选择器。例如这里,点击小书签并在js控制台中执行:

__utils__.getElementsByXPath('//table[@id="uploadTable"]/tr[position()>1]')

然后你会看到你的选择器是否正确(它在我这边起作用——我的意思是它在语法上是正确的)。

关于javascript - 使用 CasperJS 中的 XPath 查询获取所有表行并返回它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10740907/

相关文章:

javascript - jQuery slider 按钮通过数据选择器显示

javascript - 如何找到正确的这个?

javascript - Google Maps API V3 事件

xml - 在 SSIS 中,如何在 Foreach NodeList 枚举器中使用 XPATH 遍历特定元素内的 XML

javascript - 如何在嵌套模块中调用模块? javascript

javascript - 在canvasjs中使标签索引多行

sql - SQL Server 中 XML 类型列的 XPATH 查询

html - 使用 xpath 选择第 n 个元素会返回比预期更多的结果

javascript - CasperJS 传递变量进行评估无法使其正常工作

node.js - 提交大值时,casperjs 清空 POST 数据