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

Javascript 在CasperJS中使用XPath查询获取所有表行并返回它们,javascript,xpath,casperjs,Javascript,Xpath,Casperjs,我正在使用Casper.js自动执行常规上传。我已成功上载该文件并检查其是否有效,但我想分析在出现错误时返回的表,但我得到了错误[error][remote]findAll():提供的选择器无效“[object object]”:错误:语法\u ERR:DOM异常12。以下是我代码的相关部分: casper.then(function() { if (this.fetchText('.statusMessageContainer').match(/Sorry, the file did

我正在使用Casper.js自动执行常规上传。我已成功上载该文件并检查其是否有效,但我想分析在出现错误时返回的表,但我得到了错误
[error][remote]findAll():提供的选择器无效“[object object]”:错误:语法\u 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");
    }
});

有什么想法吗?

从您的错误来看,您的选择器似乎有问题。 从我看到的情况来看,它的设置是正确的,除了一件事:尝试将表[@id=“uploadTable”]/tr[position()>1]更改为表[@id=“uploadTable”]/tr[position()>1](将“”更改为“”)


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

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

此外,您还可以从加载的每个页面中自动注入的
\uuuuUtils\uuuUu
实例中方便地使用:

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");
    }
});
您还可以使用测试浏览器控制台中的选择器。例如,单击bookmarklet并在js控制台中执行:

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

然后您将看到您的选择器是否正确(它在我身边工作-我的意思是它在语法上是正确的)。

我有一个以我命名的标记。我从没想过这一天会到来*嗅嗅嗅嗅*。不幸的是,那里没有欢乐。我想这可能是我的Javascript或CasperJS(可能是前者!)的问题啊,酷。我看了一眼,似乎我的xPath是错的。我现在得到了:
var errorRows=\uuuUtils\uUtils.getElementsByXPath(“//table[@id='uploadTable']]/tbody/tr[position()>1]”
但是我现在在
这个.evaluate部分得到了一个错误,即
类型错误:'undefined'不是一个函数
。有什么想法吗?如果看不到真正的代码,很难提供帮助:/你能把一些实际的代码粘贴到某个地方吗,哪怕是私下?