फ़ैंटोमज में इन दो वास्तव में आसान कॉलबैक 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()
दिखाएगा कि जानकारी सबमिट की गई है, लेकिन केवल अगर मैं इसे एक सेटटाइमआउट() में डालता हूं, अन्यथा यह तुरंत इसे प्रस्तुत करता है और पृष्ठ को रीडायरेक्ट करने से पहले, केवल इनपुट किए गए प्रमाण-पत्र देखता हूं। शायद मैं कुछ और याद कर रहा हूँ?
आपने यह नहीं दिखाया है कि आपने 'ऑनलोड लोडेड' और 'ऑनलोड लोड' सेट किया है। आपको 'मूल्यांकन' से पहले इसे करना होगा और तैयार हैंडलर में 'रेंडर' –
होना चाहिए, मैंने इसे कॉलबैक परिभाषाओं को शामिल करने के लिए संपादित किया था। मुझे नहीं लगता कि यह समस्या है हालांकि वे 'क्लिक()' ईवेंट के लिए शुरू होने के लिए बुला नहीं रहे हैं। वे प्रत्येक के लिए बुलाते हैं 'page.open()' यद्यपि। –
हो सकता है कि आप बहुत जल्दी बाहर निकलें। कृपया मेरे उत्तर में अंतिम स्निपेट देखें। क्या यह आपके लिए काम करता है? –