4

私はこれで頭がおかしくなったに違いありませんが、なぜ印刷されなかった"1: Google Search""2: Google Search"ですか?基本的に: this.evaluate 内で変数を取得し、残りの casper.js スコープで使用するにはどうすればよいですか?

var casper = require("casper").create();
var buttonText;

casper.start("http://google.com");

casper.then(function() {
  buttonText = this.evaluate(function () {
    var myTxt = document.querySelector('#gbqfsa').innerText;
    console.log('1: ' + myTxt);

    return myTxt;
  }); 
});

casper.then(function() {
  this.echo('2: ' + buttonText);
});

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
});

casper.run();

ここでこれらのライブラリを使用しています:

https://github.com/ariya/phantomjs

http://casperjs.org/index.html

4

3 に答える 3

9

問題は、いくつかの非常にあいまいな理由で、異なるユーザー エージェントでブラウズすると、Google が異なるバージョンを提供しているように見えることです。ブラウザー/ユーザー エージェントのスニッフィングが激しいと思われます。

私たちの場合、遊んでみると、セレクターCasper.debugHTML()に一致するボタンがコードに含まれていないことが#gbqfsaわかります (Chrome ではボタンが表示されます)。代わりに、標準の送信<input name="btnG">があります。

ボタンの実際のセレクターを使用したスクリプトは次のとおりです。

var casper = require("casper").create();
var buttonText;

casper.start("http://google.com/", function() {
    buttonText = this.evaluate(function () {
        var myTxt = document.querySelector('input[name="btnG"]').getAttribute('value');
        __utils__.echo('1: ' + myTxt);
        return myTxt;
    });
    this.echo('2: ' + buttonText);
});

casper.run();

単なるアイデアCasper.userAgent()ですが、UA をより一般的なものに設定するために使用してみてください。最近のクロムバージョン。

PS:__utils__.echo()内から直接印刷するための の使用にも注意してevaluate()ください。

編集:共通のUAを設定することで機能します:

casper.start();

casper.userAgent("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16");

casper.thenOpen('http://google.com/', function() {
    this.test.assertExists('#gbqfsa'); // PASS
});

casper.run(function() {
    this.test.done();
});
于 2012-12-15T21:03:45.960 に答える
0

casper.jsまたはphantom.jsには、evaluate()内のデバッグに関して深刻な問題があると思います。下の行を置き換えると動作します

var myTxt = document.querySelector('.gbts').innerHTML;

問題は、evaluate()内にjavascriptエラーがある場合にデバッグする方法です。知る方法はありません...

于 2012-12-09T23:20:12.870 に答える
0

デバッグのためにこれを試しましたか?

casper.on('remote.message', function(message) {
    this.echo('remote console message: ' + message);
});

イベントとフィルター - 実行時の CasperJS 環境のフックと変更 をご覧ください。

于 2012-12-15T18:46:06.400 に答える