2014-10-09 6 views
16

फ़ैंटोमज में इन दो वास्तव में आसान कॉलबैक onLoadStarted और onLoadFinished हैं जो पृष्ठ लोड होने के दौरान अनिवार्य रूप से निष्पादन को रोकने की अनुमति देते हैं। लेकिन मैं खोज कर रहा हूं और यदि आप click() सबमिट बटन या हाइपरलिंक के लिए समकक्ष नहीं पा रहे हैं। एक समान पृष्ठ लोड होता है लेकिन onLoadStarted इस घटना के लिए कॉल नहीं किया जाता है, मुझे लगता है कि ऐसा कोई स्पष्ट page.open() नहीं होता है। मैं यह लोड होने पर निष्पादन को निलंबित करने का एक साफ तरीका जानने का प्रयास कर रहा हूं।जारी रखने से पहले एक क्लिक() घटना को phantomjs में लोड करने के लिए कैसे प्रतीक्षा करें?

एक समाधान स्पष्ट रूप से नेस्टेड सेटटाइमआउट है, लेकिन मैं इस परिदृश्य से बचना चाहता हूं क्योंकि यह हैकी है और किसी चीज़ के खिलाफ परीक्षण या किसी घटना की प्रतीक्षा करने जैसे विश्वसनीय और अधिक मजबूत की बजाय परीक्षण और त्रुटि पर निर्भर करता है।

क्या इस तरह के पेज लोड के लिए कोई विशिष्ट कॉलबैक है जो मुझे याद आया? या शायद किसी प्रकार का जेनेरिक कोड पैटर्न है जो इस तरह की चीज़ से निपट सकता है?

संपादित करें:

मैं अभी भी पता लगा नहीं किया है कि यह कैसे को रोकने के लिए मिलता है।

var loadInProgress = false; 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log("load started"); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log("load finished"); 
}; 

page.open(loginPage.url, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to access network'); 
     fs.write(filePath + errorState, 1, 'w'); 
     phantom.exit(); 
    } else { 
     page.evaluate(function (loginPage, credentials) { 
      console.log('inside loginPage evaluate function...\n') 
      document.querySelector('input[id=' + loginPage.userId + ']').value = credentials.username; 
      document.querySelector('input[id=' + loginPage.passId + ']').value = credentials.password;  
      document.querySelector('input[id=' + loginPage.submitId + ']').click(); 
      //var aTags = document.getElementsByTagName('a') 
      //aTags[1].click(); 
     }, loginPage, credentials); 

     page.render(renderPath + 'postLogin.png'); 
     console.log('rendered post-login'); 

मैं जाँच की डबल कि आईडी सही है: यहाँ कोड है कि onLoadStarted() फ़ंक्शन को कॉल नहीं करता है जब मैं click() आदेश फोन है। page.render() दिखाएगा कि जानकारी सबमिट की गई है, लेकिन केवल अगर मैं इसे एक सेटटाइमआउट() में डालता हूं, अन्यथा यह तुरंत इसे प्रस्तुत करता है और पृष्ठ को रीडायरेक्ट करने से पहले, केवल इनपुट किए गए प्रमाण-पत्र देखता हूं। शायद मैं कुछ और याद कर रहा हूँ?

+0

आपने यह नहीं दिखाया है कि आपने 'ऑनलोड लोडेड' और 'ऑनलोड लोड' सेट किया है। आपको 'मूल्यांकन' से पहले इसे करना होगा और तैयार हैंडलर में 'रेंडर' –

+0

होना चाहिए, मैंने इसे कॉलबैक परिभाषाओं को शामिल करने के लिए संपादित किया था। मुझे नहीं लगता कि यह समस्या है हालांकि वे 'क्लिक()' ईवेंट के लिए शुरू होने के लिए बुला नहीं रहे हैं। वे प्रत्येक के लिए बुलाते हैं 'page.open()' यद्यपि। –

+0

हो सकता है कि आप बहुत जल्दी बाहर निकलें। कृपया मेरे उत्तर में अंतिम स्निपेट देखें। क्या यह आपके लिए काम करता है? –

उत्तर

8

उच्च स्तरीय रैपर, nightmarejs का उपयोग करें। आप आसानी से click कर सकते हैं और बाद में प्रतीक्षा कर सकते हैं।

var Nightmare = require('nightmare'); 
new Nightmare() 
    .goto('http://yahoo.com') 
    .type('input[title="Search"]', 'github nightmare') 
    .click('.searchsubmit') 
    .run(function (err, nightmare) { 
     if (err) return console.log(err); 
     console.log('Done!'); 
    }); 

अधिक उदाहरण और एपीआई उपयोग github

+2

दुःस्वप्न एक नोड मॉड्यूल है और इसलिए सादे फ़ैंटॉमजेएस के लिए लागू नहीं है। लाइब्रेरी का उपयोग करके –

+0

हालांकि इसे बहुत आसान बनाता है। इस पर ध्यान दिलाने के लिए धन्यवाद! मेरी जरूरतों के लिए यह एक बेहतर विकल्प था –

+0

वाह, प्रेत के साथ संघर्ष के घंटे, मेरी सभी समस्याएं दुःस्वप्न के साथ 5 मिनट में हल हो गईं। यह एक अद्भुत उपकरण है, इसे पर्याप्त +1 नहीं कर सकता। –

12

में पाया जा सकता मुझे लगता है कि onLoadStarted और onLoadFinished कार्यों सब कुछ आप की जरूरत है:

यहाँ कोड (उदाहरण अनुभाग) है। उदाहरण के लिए ले लो निम्न स्क्रिप्ट:

var page = require('webpage').create(); 

page.onResourceReceived = function(response) { 
    if (response.stage !== "end") return; 
    console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + response.url); 
}; 
page.onResourceRequested = function(requestData, networkRequest) { 
    console.log('Request (#' + requestData.id + '): ' + requestData.url); 
}; 
page.onUrlChanged = function(targetUrl) { 
    console.log('New URL: ' + targetUrl); 
}; 
page.onLoadFinished = function(status) { 
    console.log('Load Finished: ' + status); 
}; 
page.onLoadStarted = function() { 
    console.log('Load Started'); 
}; 
page.onNavigationRequested = function(url, type, willNavigate, main) { 
    console.log('Trying to navigate to: ' + url); 
}; 

page.open("http://example.com", function(status){ 
    page.evaluate(function(){ 
     // click 
     var e = document.createEvent('MouseEvents'); 
     e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
     document.querySelector("a").dispatchEvent(e); 
    }); 
    setTimeout(function(){ 
     phantom.exit(); 
    }, 10000); 
}); 

यह

 
Trying to navigate to: http://example.com/ 
Request (#1): http://example.com/ 
Load Started 
New URL: http://example.com/ 
Response (#1, stage "end"): http://example.com/ 
Load Finished: success 
Trying to navigate to: http://www.iana.org/domains/example 
Request (#2): http://www.iana.org/domains/example 
Load Started 
Trying to navigate to: http://www.iana.org/domains/reserved 
Request (#3): http://www.iana.org/domains/reserved 
Response (#2, stage "end"): http://www.iana.org/domains/example 
New URL: http://www.iana.org/domains/reserved 
Request (#4): http://www.iana.org/_css/2013.1/screen.css 
Request (#5): http://www.iana.org/_js/2013.1/jquery.js 
Request (#6): http://www.iana.org/_js/2013.1/iana.js 
Response (#3, stage "end"): http://www.iana.org/domains/reserved 
Response (#6, stage "end"): http://www.iana.org/_js/2013.1/iana.js 
Response (#4, stage "end"): http://www.iana.org/_css/2013.1/screen.css 
Response (#5, stage "end"): http://www.iana.org/_js/2013.1/jquery.js 
Request (#7): http://www.iana.org/_img/2013.1/iana-logo-header.svg 
Request (#8): http://www.iana.org/_img/2013.1/icann-logo.svg 
Response (#8, stage "end"): http://www.iana.org/_img/2013.1/icann-logo.svg 
Response (#7, stage "end"): http://www.iana.org/_img/2013.1/iana-logo-header.svg 
Request (#9): http://www.iana.org/_css/2013.1/print.css 
Response (#9, stage "end"): http://www.iana.org/_css/2013.1/print.css 
Load Finished: success 

प्रिंट यह दर्शाता है कि एक लिंक पर क्लिक एक बार और NavigationRequested घटना LoadStarted घटना का उत्सर्जन करता है दो बार, कोई रीडायरेक्ट है क्योंकि वहाँ। चाल कार्रवाई करने से पहले ईवेंट हैंडलर्स जोड़ने के लिए है:

var page = require('webpage').create(); 

page.open("http://example.com", function(status){ 
    page.onLoadFinished = function(status) { 
     console.log('Load Finished: ' + status); 
     page.render("test37_next_page.png"); 
     phantom.exit(); 
    }; 
    page.onLoadStarted = function() { 
     console.log('Load Started'); 
    }; 

    page.evaluate(function(){ 
     var e = document.createEvent('MouseEvents'); 
     e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
     document.querySelector("a").dispatchEvent(e); 
    }); 
}); 

आप उन चीजों को करने की जरूरत है, शायद यह CasperJS की तरह कुछ और प्रयास करने के लिए समय है। यह फैंटॉमजेएस के शीर्ष पर चलता है, लेकिन वेब पेजों को नेविगेट करने के लिए एक बेहतर एपीआई है।

0

मेरा कोड कुछ अन्य उत्तरों के आधार पर है। मेरे मामले में, मुझे किसी अन्य जावास्क्रिप्ट का विशेष मूल्यांकन करने की आवश्यकता नहीं थी। मुझे बस लोड होने के लिए पेज की प्रतीक्षा करने की आवश्यकता है।

var system = require('system'); 
if (system.args.length === 1) { 
    console.log('Try to pass some arguments when invoking this script!'); 
} 
else { 
    var page = require('webpage').create(); 
    var address = system.args[1]; 

    page.open(address, function(status){ 
     page.onLoadFinished = function(status) { 
      console.log(page.content); 
      phantom.exit(); 
     };  
    });  
} 

उपरोक्त को "स्क्रैप" नामक फ़ाइल में सहेजें।js "और इसे इस तरह कहते हैं:।

phantomjs --ssl-protocol=any --ignore-ssl-errors=true scrape.js https://www.example.com 

एसएसएल संबंधी पैरामीटर अन्य मुद्दों है कि मैं कुछ HTTPS साइटों (मुद्दों प्रमाणपत्र लोड हो रहा है से संबंधित) के साथ चल रहा था से बचने के लिए जोड़ रहे हैं

आशा इस कोई मदद करता है

+0

क्या आप वाकई यह कोड काम करते हैं जब आप इसका वर्णन करते हैं? 'Page.open' कॉलबैक फ़ंक्शन को वास्तव में 'पेज.ऑनलोड फ़िनिश' ईवेंट हैंडलर फायरिंग के रूप में एक ही समय में बुलाया जाना चाहिए। दोनों चीजों को करने का मतलब मेरे लिए होगा कि दूसरा निकाल दिया नहीं गया है। –

+0

@ आर्टजॉम-बी हाँ यह काम करता है। यह एक ही बात है कि आप सिवाय इसके कि मैं page.onLoadStarted हटा दिया और page.evaluate कॉल के बाद से मैं उन्हें जरूरत नहीं थी तैनात है। मुझे यकीन नहीं है कि मैं समझता हूं कि आपका क्या मतलब है। – http203

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

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