3

私はCasper.jsを使用して定期的なアップロードを自動化しています。ファイルをアップロードして有効かどうかを確認しましたが、エラーが発生した場合に返されるテーブルを解析したいのですが、エラーが発生します[error] [remote] findAll(): invalid selector provided "[object Object]":Error: SYNTAX_ERR: DOM Exception 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");
    }
});

何か案は?

4

2 に答える 2

2

evaluate()XPath 構文エラーが発生している可能性がありますが、メソッドに渡されたクロージャーから DOM 要素を返すことはできないことを知っておく必要があります。インスタンスをいくつかのネイティブ Javascript タイプに変換する必要がNodeListあります。HTMLelement配列、オブジェクト、文字列など…</p>

また、getElementsByXPath()ClientUtils モジュール__utils__には、ロードするすべてのページに自動的に挿入されるインスタンスから使用できる便利なメソッドがあります。

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 ブックマークレットを使用して、ブラウザー コンソール内で直接セレクターをテストすることもできます。たとえば、ブックマークレットをクリックして、js コンソールでこれを実行します。

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

次に、セレクターが正しいかどうかを確認します (私の側では機能します — つまり、構文的に正しいということです)。

于 2012-05-28T10:01:44.540 に答える
0

エラーから、セレクターに問題があるようです。'//table[@id="uploadTable"]/tr[position()>1]'私が見ることができるものから正しくセットアップされていますが、1つだけ例外があります:に変更してみてください'//table[@id='uploadTable']/tr[position()>1]'( ""を''に変更)

それ以外は、XPathは構文的に正しいように見えるので、なぜ無効なセレクターと見なされるのかわかりません。

于 2012-05-24T18:48:33.253 に答える