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

时间:2012-05-24 15:48:47

标签: javascript xpath casperjs

我使用Casper.js自动定期上传。我已设法上传文件并检查其是否有效,但我想解析在发生错误时返回的表格,但我收到错误{{1 \ n \ n \ n \ n }}。这是我的代码的相关部分:

[error] [remote] findAll(): invalid selector provided "[object Object]":Error: SYNTAX_ERR: DOM Exception 12

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

此外,您可以在__utils__实例中使用方便的getElementsByXPath() method in the ClientUtils module,并在每个页面中自动注入您的负载:

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在浏览器控制台中测试您的选择器。例如,单击bookmarklet并在js控制台中执行:

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

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

答案 1 :(得分:0)

从您的错误中可以看出,您的选择器出现了问题。 除了一件事之外,它可以从我能看到的内容中正确设置:尝试将'//table[@id="uploadTable"]/tr[position()>1]'更改为'//table[@id='uploadTable']/tr[position()>1]'(将“更改为”更改为'')

除此之外,你的XPath在语法上看起来是正确的,所以我不确定为什么它会被认定为无效的选择器。