2012-11-29 16 views
5

मैं जावास्क्रिप्ट समर्थन के साथ वेबकिट (सी ++/क्यूटी 4 का उपयोग करके) पर एक हेडलेस ब्राउज़र पर काम कर रहा हूं। इसका मुख्य उद्देश्य जावास्क्रिप्ट पर आधारित वेबसाइटों का एक HTML स्पैनशॉट उत्पन्न करने में सक्षम है (Backbone.js या कोई अन्य जावास्क्रिप्ट एमवीसी देखें)।Heisenbug अपने हेडलेस ब्राउज़र के साथ

मुझे पता है जानते हुए भी जब पेज पूरी तरह से लोड है के लिए किसी भी तरह से नहीं है कि कर रहा हूँ (कृपया this question देखें) और उसकी वजह से, के बाद मैं loadFinished संकेत मिलता है (डॉक्स here) मैं एक टाइमर बना सकते हैं और यह देखने के लिए कि क्या कोई बदलाव आया है, डीओएम सामग्री को मतदान करना शुरू करें (जैसा कि प्रत्येक एक्स एमएस डीओएम की सामग्री को जांचता है)। अगर वहां मैं मानता हूं कि पृष्ठ लोड किया गया था और परिणाम प्रिंट किया गया था। कृपया ध्यान रखें कि मुझे पहले से ही पता है कि यह निकट-सही समाधान नहीं है, लेकिन यह केवल एकमात्र ऐसा है जिसे मैं सोच सकता हूं। यदि आपके पास कोई बेहतर विचार है तो कृपया this question

नोट: टाइमर गैर-अवरुद्ध है, जिसका अर्थ है कि वेबकिट के अंदर चलने वाली हर चीज़ को किसी भी तरह से प्रभावित/अवरुद्ध/रोका नहीं जाना चाहिए।

कुछ पृष्ठों के साथ हेडलेस ब्राउज़र का परीक्षण करने के बाद, सबकुछ ठीक काम करता है (या कम से कम अपेक्षित)। लेकिन यहां वह जगह है जहां हेइसेनबग दिखाई देता है। हेडलेस ब्राउज़र को एक PHP स्क्रिप्ट से बुलाया जाना चाहिए, जिसे कुछ आउटपुट के लिए प्रतीक्षा करना (कॉल अवरुद्ध करना) और फिर इसे प्रिंट करना चाहिए।

मेरी टेस्ट मशीन (अपाचे 2.3.14, PHP 5.4.6) पर PHP स्क्रिप्ट आउटपुट वांछित परिणाम, उर्फ, हेडलेस ब्राउज़र वेबसाइट को लाता है, जावास्क्रिप्ट चलाता है और प्रिंट करता है कि उपयोगकर्ता क्या देखेगा; लेकिन उत्पादन सर्वर में एक ही स्क्रिप्ट चलाने से वेबसाइट प्राप्त होगी, जावास्क्रिप्ट कोड के कुछ चलाएं और परिणाम प्रिंट करें।

हेडलेस ब्राउज़र और PHP स्क्रिप्ट का स्रोत कोड मैं उपयोग कर रहा हूं here पाया जा सकता है।

नोट: टाइमर (आप बिना सिर ब्राउज़र के स्रोत कोड में देख सकते हैं) 1s करने के लिए सेट कर दिया जाता है, लेकिन समय का एक बड़ा राशि की स्थापना समस्या हल नहीं होती

नोट 2: सभी जावास्क्रिप्ट त्रुटियों को पकड़ना कुछ भी नहीं दिखाता है, इसलिए यह अनुपलब्ध फ़ंक्शन, गलत तर्क, या किसी अन्य प्रकार के गलत कोड की वजह से नहीं है।

मैं 2 वेबसाइटों के साथ हेडलेस ब्राउज़र का परीक्षण कर रहा हूं। This one मेरी टेस्ट मशीन और उत्पादन सर्वर दोनों पर काम कर रहा है, जबकि this one केवल मेरी टेस्ट मशीन में काम करता है।

मैं यह सोचने के लिए और अधिक अनुमान लगाता हूं कि यह हेडलेस ब्राउज़र के कोड की बजाय दूसरी वेबसाइट में जावास्क्रिप्ट कोड में कुछ अजीब बग है, क्योंकि यह पहली वेबसाइट का एक आदर्श HTML स्नैपशॉट उत्पन्न करता है, लेकिन फिर फिर से , यह एक हेज़ेनबग है इसलिए मुझे सच में यकीन नहीं है कि यह सब क्या कर रहा है।

किसी भी विचार/टिप्पणियों की सराहना की जाएगी। धन्यवाद

+1

मुझे करीबी वोट नहीं समझते हैं। कृपया मुझे बताएं कि इस प्रश्न के साथ क्या गलत है। – alexandernst

+0

जानना दिलचस्प होगा 1. किस बिंदु पर प्रोड सर्वर पर जेएस कोड निष्पादित किया गया है और 2. देव और प्रोड सर्वर के बीच अंतर क्या हैं। –

+0

@ होंगार पृष्ठ पूरी तरह से लोड होने के बाद कोड निष्पादित किया जाता है ('' '$ (दस्तावेज़) .ready (f ...)' '')। जेएस के साथ जेनरेट किया गया एक छोटा "लोडिंग" विजेट है (जिसे मैं प्रोड मशीन पर PHP चलाने के बाद देखता हूं), और इस बीच एक AJAX अनुरोध किया जाता है। AJAX कॉलबैक को बैकबोन द्वारा संसाधित किया जाता है, "लोडिंग" विजेट हटा दिया जाता है और वास्तविक डेटा DOM पर रखा जाता है। (यह हिस्सा प्रोड मशीन पर नहीं किया गया है बल्कि केवल मेरी टेस्ट मशीन में)। – alexandernst

उत्तर

0

डीओएम परिवर्तनों के लिए मतदान करने की बजाय, नेटवर्क अनुरोध क्यों नहीं देखते? यह उपयोग करने के लिए एक सुरक्षित हेरिस्टिक की तरह लगता है। यदि एक्स एमएस (और कोई लंबित अनुरोध नहीं है) के लिए कोई नेटवर्क गतिविधि नहीं है, तो मान लें कि पृष्ठ पूरी तरह से "लोड" है।

+0

मैंने इसके बारे में सोचा भी। लेकिन क्या होगा यदि पृष्ठ बैकबोन.जेएस (कोणीय, बैटमैन, जो भी ...) के साथ बनाया गया था और कोई अनुरोध किए बिना कुछ भारी डोम परिवर्तन कर रहा है? – alexandernst

संबंधित मुद्दे