私は、JavaScript をサポートする WebKit (C++/Qt4 を使用) に基づくヘッドレス ブラウザーに取り組んでいます。これの主な目的は、JavaScript に大きく基づいた Web サイトの HTML スパンショットを生成できるようにすることです (Backbone.js またはその他の JavaScript MVC を参照してください)。
ページが完全にロードされたことを知る方法がないことを認識しています (この質問を参照してください)。そのため、loadFinished
シグナルを取得した後 (ドキュメントはこちら)、タイマーを作成し、DOM コンテンツのポーリングを開始します ( DOM のコンテンツを X ミリ秒ごとにチェックして、変更があったかどうかを確認します。ない場合は、ページが読み込まれたと想定して結果を出力します。これが完璧に近い解決策ではないことは既にわかっていますが、私が考えることができる唯一の解決策であることに注意してください。もっと良いアイデアがあれば、この質問に答えてください
注: タイマーは非ブロックです。つまり、WebKit 内で実行されているすべてのものが影響を受けたり、ブロックされたり、一時停止したりしてはなりません。
いくつかのページでヘッドレス ブラウザをテストした後、すべてが正常に (または少なくとも期待どおりに) 動作するようです。しかし、ここにハイゼンバグが現れます。ヘッドレス ブラウザは PHP スクリプトから呼び出す必要があります。PHP スクリプトは出力を待って (呼び出しをブロック)、出力します。
私のテスト マシン (Apache 2.3.14、PHP 5.4.6) で PHP スクリプトを実行すると、目的の結果が出力されます。つまり、ヘッドレス ブラウザーが Web サイトを取得し、JavaScript を実行して、ユーザーに表示される内容を出力します。ただし、本番サーバーで同じスクリプトを実行すると、Web サイトが取得され、JavaScript コードの一部が実行され、結果が出力されます。
ヘッドレス ブラウザのソース コードと、私が使用している PHP スクリプトは、ここにあります。
注: タイマー (ヘッドレス ブラウザーのソース コードで確認できるように) は 1 秒に設定されていますが、より長い時間を設定しても問題は解決しません。
注 2: すべての JavaScript エラーをキャッチしても何も表示されないため、関数の欠落、引数の誤り、またはその他の不正なコードが原因ではありません。
2 つの Web サイトでヘッドレス ブラウザをテストしています。 これはテスト マシンと実稼働サーバーの両方で動作していますが、これはテスト マシンでのみ動作します。
これは、最初の Web サイトの完全な HTML スナップショットを生成するため、ヘッドレス ブラウザーのコードではなく、2 番目の Web サイトの JavaScript コードの奇妙なバグであると考える方が適切ですが、繰り返しになりますが、これはハイゼンバグなので、何が原因なのかよくわかりません。
任意のアイデア/コメントをいただければ幸いです。ありがとうございました