CasperJS प्रलेखन के अनुसार :
then()
हस्ताक्षर: then(Function then)
यह विधि एक सरल कार्य प्रदान करके, स्टैक में एक नया नेविगेशन चरण जोड़ने का मानक तरीका है:
casper.start('http://google.fr/');
casper.then(function() {
this.echo('I\'m in your google.');
});
casper.then(function() {
this.echo('Now, let me write something');
});
casper.then(function() {
this.echo('Oh well.');
});
casper.run();
आप जितने आवश्यक हो उतने चरण जोड़ सकते हैं। ध्यान दें कि वर्तमान Casper
उदाहरण स्वचालित रूप से this
आपके लिए चरण फ़ंक्शंस में कीवर्ड को बांधता है ।
आपके द्वारा परिभाषित सभी चरणों को चलाने के लिए, run()
विधि और वॉइला को कॉल करें ।
नोट: विधि start()
का उपयोग करने के लिए आपको कैस्पर उदाहरण होना चाहिए then()
।
चेतावनी: चरणबद्ध कार्य then()
दो अलग-अलग मामलों में संसाधित किए जाते हैं:
- जब पिछले चरण फ़ंक्शन निष्पादित किया गया है,
- जब पिछला मुख्य HTTP अनुरोध निष्पादित हो गया हो और पेज लोड हो गया हो ;
ध्यान दें कि पेज लोड की कोई एक परिभाषा नहीं है ; क्या यह तब है जब DOMReady घटना को ट्रिगर किया गया है? क्या यह "सभी अनुरोध समाप्त हो रहे हैं"? क्या यह "सभी एप्लिकेशन लॉजिक प्रदर्शन किया जा रहा है"? या "सभी तत्वों का प्रतिपादन किया जा रहा है"? उत्तर हमेशा संदर्भ पर निर्भर करता है। इसलिए आपको हमेशा इसका उपयोग करने के लिए प्रोत्साहित क्यों किया जाता हैwaitFor()
परिवार के तरीकों का जाता है ताकि आप वास्तव में जो उम्मीद करते हैं उस पर स्पष्ट नियंत्रण रखें।
एक सामान्य चाल है waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
पर्दे के पीछे, स्रोत कोडCasper.prototype.then
नीचे दिखाया गया है:
/**
* Schedules the next step in the navigation process.
*
* @param function step A function to be called as a step
* @return Casper
*/
Casper.prototype.then = function then(step) {
"use strict";
this.checkStarted();
if (!utils.isFunction(step)) {
throw new CasperError("You can only define a step as a function");
}
// check if casper is running
if (this.checker === null) {
// append step to the end of the queue
step.level = 0;
this.steps.push(step);
} else {
// insert substep a level deeper
try {
step.level = this.steps[this.step - 1].level + 1;
} catch (e) {
step.level = 0;
}
var insertIndex = this.step;
while (this.steps[insertIndex] && step.level === this.steps[insertIndex].level) {
insertIndex++;
}
this.steps.splice(insertIndex, 0, step);
}
this.emit('step.added', step);
return this;
};
स्पष्टीकरण:
दूसरे शब्दों में, then()
में, नेविगेशन प्रक्रिया में अगला चरण निर्धारित करता है।
कब then()
कहा जाता है, तो इसे एक फ़ंक्शन के रूप में एक पैरामीटर पास किया जाता है जिसे एक चरण के रूप में कहा जाता है।
यह जाँचता है कि क्या कोई उदाहरण शुरू हो गया है, और यदि ऐसा नहीं है, तो यह निम्न त्रुटि प्रदर्शित करता है:
CasperError: Casper is not started, can't execute `then()`.
अगला, यह जाँचता है कि क्या page
वस्तु है null
।
यदि स्थिति सही है, तो कैस्पर एक नई page
वस्तु बनाता है ।
उसके बाद, यदि यह फ़ंक्शन नहीं है, तो जांच then()
करने के लिए step
पैरामीटर को मान्य करता है।
यदि पैरामीटर एक फ़ंक्शन नहीं है, तो यह निम्न त्रुटि प्रदर्शित करता है:
CasperError: You can only define a step as a function
फिर, फ़ंक्शन जाँचता है कि कैस्पर चल रहा है या नहीं।
यदि कैस्पर नहीं चल रहा है, then()
तो कतार के अंत में कदम जोड़ता है।
अन्यथा, यदि कैस्पर चल रहा है, तो यह पिछले चरण की तुलना में एक स्तर गहरा एक सबस्टेप सम्मिलित करता है।
अंत में, then()
समारोह एक step.added
घटना का उत्सर्जन करके समाप्त होता है , और कैस्पर ऑब्जेक्ट को वापस करता है।
flow
केसपरज के जनरल के स्पष्टीकरण की तलाश में हूं, लेकिन मैंने पाया है कि आप मूल रूप सेevaluate
कॉल करने के लिए कैस्पर को संदर्भित नहीं कर सकते । (यानी आप एक नया यूआरएल, लॉग, इको आदि नहीं खोल सकते हैं)। इसलिए मेरे मामले में मूल्यांकन को बुलाया जा रहा था लेकिन बाहरी दुनिया के साथ बातचीत करने का कोई तरीका नहीं था।