2012-11-29 10 views
5

私は、JavaScriptをサポートしたWebKit(C++/Qt4を使用)に基づくヘッドレスブラウザに取り組んでいます。これの主な目的は、JavaScript(Backbone.jsやその他のJavaScript MVCを参照)に基づいてWebサイトのHTMLスパンショットを生成できることです。私はページが完全にロードされるときを知るためにどのような方法がないことを承知しているHeisenbug独自のヘッドレスブラウザ

this questionを参照してください)、私はloadFinished信号を取得した後、そのため、(ドキュメントをhere)私はタイマーを作成し、 DOMコンテンツのポーリングを開始し(DOMのコンテンツごとにX msをチェックする)、変更があったかどうかを確認します。私は、ページがロードされたと仮定していない場合、結果を印刷します。私はこれが完璧ではない解決策ではないことをすでに知っていることを覚えておいてください。しかし、私が考えることができるのはこれだけです。もっと良いアイデアがある場合は、this question

注:タイマーは非ブロックであり、WebKit内で実行されているすべてが影響を受けてはいけないことを意味します。

いくつかのページでヘッドレスブラウザをテストした後、すべてが正常に動作するように見えます(少なくとも予想どおり)。しかし、ここでは、どこに虫が出現するのですか?ヘッドレスブラウザは、PHPスクリプトから呼び出される必要があります。PHPスクリプトは、一部の出力を待つ(呼び出しをブロックする)必要があります。

私のテストマシン(Apache 2.3.14、PHP 5.4.6)では、PHPスクリプトを実行すると、望遠のブラウザがウェブサイトを取得し、JavaScriptを実行してユーザーに表示される内容を出力します。プロダクションサーバーで同じスクリプトを実行すると、ウェブサイトが取得されます。 JavaScriptコードを実行して結果を出力します。

私が使用しているヘッドレスブラウザとPHPスクリプトのソースコードはhereです。

注:タイマーは(あなたがヘッドレスブラウザのソースコードに見ることができるように)1に設定されていますが、時間の大きな量を設定すること

注2を問題を解決していません。すべてのJavaScriptエラーをキャッチするには何も表示されないので、関数がないか、argsが間違っている、または他のタイプの不正なコードが原因ではありません。

私は2つのウェブサイトでヘッドレスブラウザをテストしています。 This oneはテストマシンとプロダクションサーバーの両方で動作していますが、this oneはテストマシンでのみ動作します。

これは、最初のウェブサイトの完全なHTMLスナップショットを生成するので、ヘッドレスブラウザのコードではなく、2番目のウェブサイトのJavaScriptコードでこれが奇妙なバグだと思っています、これはheisenbugなので、私は本当にこのすべてを引き起こしているのか分かりません。

どのようなアイデアやコメントをいただければ幸いです。ありがとうございました

+1

私は近い票を理解していません。この質問に何が間違っているのか教えてください。 – alexandernst

+0

興味深いのは1. prodサーバー上のJSコードがどの時点で実行されたか、そして2. devとprodサーバーの違いは何か。 –

+0

@hongaarコードは、ページが完全に読み込まれた後に実行されます( '' '$(document).ready(f ...)' '')。 JS(これは私がprodマシンでPHPを実行した後に表示されます)で生成された小さな「ロード」ウィジェットがあり、その間にAJAXリクエストが行われます。 AJAXコールバックはBackboneによって処理され、「ロード」ウィジェットは削除され、実際のデータはDOMに配置されます。 (この部分はprodマシンではなく、私のテストマシンでのみ行われます)。 – alexandernst

答えて

0

DOM変更のポーリングではなく、ネットワークリクエストを監視するのはなぜですか?これは、より安全なヒューリスティックのように思えます。 X msのネットワークアクティビティがなく(保留中の要求がない場合)、ページは完全にロードされていると仮定します。

+0

私はそれについて考えましたあまりにも。しかし、ページがBackbone.JS(Angular、Batman、何でも...)で作成されていて、何の要求もせずにDOMの重い変更を行っている場合はどうなりますか? – alexandernst

関連する問題