1

CasperJS は初めてです。this.echo(this.getTitle());なぜうまくいくのにうまくいかconsole.log("Page Title ", document.title);ないのですか?また、なぜ私の document.querySelector が機能しないのですか? 誰か良い説明がありますか?CasperJS ドキュメントのどこで答えを見つけることができますか?

これが私のコードです:

var casper = require('casper').create();
var url = 'http://www.example.com/';

 casper.start(url, function() {
     this.echo(this.getTitle()); // works
     this.echo(this.getCurrentUrl()); // works
});

casper.then(function(){
    this.echo(this.getCurrentUrl()); // works
    console.log("this is URL: ", document.URL); // doesn't work
    console.log("Page Title ", document.title); // doesn't work
    var paragraph = document.querySelectorAll('p')[0].innerHTML;
    console.log(paragraph); // doesn't work
});

casper.run();

編集: 私は casper.thenEvaluate と casper.evaluate を使用していますが、まだ機能していません。何か案は?

var casper = require('casper').create();
var url = 'http://www.example.com/';

casper.start(url, function() {
    this.echo(this.getTitle()); // works
    this.echo(this.getCurrentUrl()); // works
    console.log('page loaded: '); // works
});

casper.thenEvaluate(function(){
    var paragraph = document.querySelectorAll('p')[0].innerHTML; // doesn't work
    console.log(paragraph); // doesn't work
    console.log("Page Title ", document.title); // doesn't work
});

casper.run();
4

4 に答える 4

7

documentwithに依存する関数を呼び出す必要がありますthis.evaluate

var paragraph = this.evaluate(function() {
    return document.querySelector('p').innerHtml;
});

疑問がある場合は、ドキュメントを参照してください。

于 2013-08-20T06:35:12.420 に答える
3

CasperJS は、PhantomJS から DOM コンテキスト (ページ コンテキスト) と外部コンテキストの間の分割を継承しています。を介してのみ、サンドボックス化された DOM コンテキストにアクセスできますcasper.evaluate()documentコールバックの内側は、evaluate()通常の JavaScript で期待される変数ですが、document外側にもevaluate()ダミー オブジェクトがあり、ページの DOM へのアクセスを提供しません。

DOM プロパティにアクセスする場合は、 を使用する必要がありますevaluate()

var title = casper.evaluate(function(){
    return document.title;
});

ただし、これは DOM ノードでは機能しません。DOM コンテキストから渡すことができるのはプリミティブ オブジェクトだけだからです。PhantomJS のドキュメントには、次のように記載されています。

注:関数の引数と戻り値はevaluate、単純なプリミティブ オブジェクトでなければなりません。経験則: JSON 経由でシリアル化できる場合は問題ありません。

クロージャ、関数、DOM ノードなどは機能しません!

を使用する場合は、外部に渡すことができる DOM ノードの表現document.querySelector()を作成する必要があります。

var form = casper.evaluate(function() {
    var f = document.querySelector('form');
    return { html: f.innerHTML, action: f.action };
});
casper.echo(JSON.stringify(form, undefined, 4));

casper.getElementsInfo()などの DOM ノードの表現を提供できるすべての利用可能な CasperJS 関数を使用することもできます。

また、CasperJS の評価関数の理解もご覧ください

于 2016-01-07T09:47:00.070 に答える
0

this.getTitle() は、Casper オブジェクトで getTitle() 関数を実行し、Casper コンテキストで実行されるため、期待される結果が得られます。

ただし、'document' は Casper コンテキストでは使用できません。根本的な理由は、Casper が Web ブラウザーである PhantomJS を実行していることです。そのため、「ドキュメント」はブラウザーでのみ使用できます。これは、Casper コンテキストで実行されるコードよりも 1 レベル「深い」ものです。2 つの環境間で変数を直接共有する方法はありませんが、値をコピーしてパラメーターとして渡す方法があります。

2 つの環境 (Casper と Phantom) の間の「ブリッジ」は、Casper の「評価」機能です。パラメータとして「evaluate」に渡される関数内のすべては、Casper コンテキストではなく、ブラウザ コンテキストで実行されます。それは重要な違いです。Blenderが指摘しているように、ドキュメントはここから入手できます。

http://docs.casperjs.org/en/latest/modules/casper.html#evaluate

以下の例:

 casper.evaluate(function(username, password) {
     document.querySelector('#username').value = username;
     document.querySelector('#password').value = password;
     document.querySelector('#submit').click(); 
 }, 'sheldon.cooper', 'b4z1ng4');

与えられた例では、Casper 環境からブラウザー (ページ) 環境に「ユーザー名」および「パスワード」パラメーターを渡す方法を確認できます。

匿名の「関数 (ユーザー名、パスワード)」はブラウザー内で実行されます。したがって、その中で「ドキュメント」を使用できます。

Casper 側で取得できる値を返すこともできます。いえ

var result = casper.evaluate(function run_in_browser(){
    return document.title;
});
于 2013-10-03T14:21:29.473 に答える
0

this.echo(this.fetchText('p'));innerhtml を取得してみてください。ドキュメントを参照

于 2015-04-25T11:48:38.787 に答える