2

初めて PhantomJs を試しています。私の目標は、シンプルでシンプルなページの自動化です。

私がする必要があるのは - ウェブページをロードする、例えば www.google.com としましょう - クエリ用語を入力する - 検索結果ページの単に (本当に、これだけ) console.log

私が見つけたすべてのチュートリアルは複雑すぎるタスクから始まっているため、問題が発生しています。

以下は私の個人的なステップバイステップのチュートリアルですが、これは「送信後にページのコンテンツをログに記録する方法」という質問で「終了」します。

私が行った最初のSTEPは次のとおりです。

var page = require('webpage').create();
page.open('https://www.google.it', function () {
    console.log (page.content);
    phantom.exit()
});

そして、これは機能します。

次に、jquery を挿入します。

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {

        console.log (page.content);
        phantom.exit()
    });

});

それは働いています。

今、検索ボックスに入力しようとしています。このフィールドに入力する必要があります

<input autocomplete="off" class="lst" value="" title="Cerca con Google" maxlength="2048" name="q" size="57" style="...[omitted]...">

私はこれをやっています:

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {

        console.log (page.content);
        var value = page.evaluate(function() {
            $('input[name="q"]').val("Daduu");
            return $('input[name="q"]').val();
        });
        console.log ("search term: " + value);
        phantom.exit()
    });

});

そしてそれは働いています。次に、送信ボタンを「クリック」する必要があります

<input class="lsb" value="Cerca con Google" name="btnG" type="submit">

これを行う:

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {


        var value = page.evaluate(function() {
            $('input[name="q"]').val("Daduu");
            $('input[name="btnG"]').trigger("click");
            return $('input[name="q"]').val();
        });
        // console.log (page.content);
        page.render("google.png");
        phantom.exit()
    });

});

画像を見ると(人間の方法でレンダリングされた結果を見るためだけに)、「q」フィールドが埋められた google.it ページが表示されます。

質問は次のとおりです。

**本当にページが読み込まれていますか [Google 検索ですか] ? **

「コンテンツの console.log または page.render へのページ変更を検出する方法は?」

編集: 私はこれを見ます: Phantomjs - フォームに入力し、送信して結果を取得する方法は?

しかし、これは私が必要とするものではありません。ページをレンダリングするために「settimeout」するのではなく、ページの読み込みが完了したことを検出したい。

編集 2: 私はこれを見ます: PhantomJS: フォームを送信します

しかし、これは複雑すぎて、これがどのように機能するのか理解できませんでした。

おそらくsetTimeoutをすべてラップする必要がありますが、jsオブジェクトを使用しているため、イベント駆動型で動作する方法を探しています

onInitialPageLoaded (
  fillForm
  click
)

onSearchResultLoaded (
  render or log content of page
)

しかし、PhantomJsでそれが可能かどうか、そしてそれを実現する方法がまったくわかりません!

4

1 に答える 1

1

PhantomJS 自体はテスト フレームワークではありません。CasperJsなどのテスト目的で便利な高レベル機能を提供するために、PhantomJS の上に構築されたプロジェクトがあります。

casperJs で「phantomjs」を検索してみましょう。

var links = [];
var casper = require('casper').create();

function getLinks() {
    var links = document.querySelectorAll('h3.r a');
    return Array.prototype.map.call(links, function(e) {
        return e.getAttribute('href')
    });
}

casper.start(function() {
    // now search for 'phantomjs' by filling the form again
    this.fill('form[action="/search"]', { q: 'phantomjs' }, true);
});

casper.then(function() {
    // aggregate results for the 'phantomjs' search
    links = links.concat(this.evaluate(getLinks));
});

casper.run(function() {
    // echo results in some pretty fashion
    this.echo(links.length + ' links found:');
    this.echo(' - ' + links.join('\n - ')).exit();
});

PhantomJS の作成者である Ariya Hidayat から

CasperJS をまだ見ていない場合は、ぜひご覧ください。これは、PhantomJS の非常に便利なコンパニオンです。

于 2013-06-07T11:30:57.633 に答える