ตามเอกสาร 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()
method และ voila
หมายเหตุ:คุณต้องstart()
ใช้อินสแตนซ์ casper จึงจะใช้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
แสดงอยู่ด้านล่าง:
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");
}
if (this.checker === null) {
step.level = 0;
this.steps.push(step);
} else {
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
หรือไม่
ถ้าเงื่อนไขเป็นจริง Casper จะสร้างpage
วัตถุใหม่
หลังจากนั้นthen()
ตรวจสอบความถูกต้องของstep
พารามิเตอร์เพื่อตรวจสอบว่าไม่ใช่ฟังก์ชันหรือไม่
หากพารามิเตอร์ไม่ใช่ฟังก์ชันจะแสดงข้อผิดพลาดต่อไปนี้:
CasperError: You can only define a step as a function
จากนั้นฟังก์ชันจะตรวจสอบว่า Casper กำลังทำงานอยู่หรือไม่
หาก Casper ไม่ทำงานให้ต่อthen()
ท้ายขั้นตอนต่อท้ายคิว
มิฉะนั้นหาก Casper กำลังทำงานอยู่มันจะแทรกระดับย่อยที่ลึกกว่าขั้นตอนก่อนหน้า
สุดท้ายthen()
ฟังก์ชันจะสรุปโดยการเปล่งstep.added
เหตุการณ์และส่งคืนวัตถุ Casper
flow
ของ casperjs แต่ฉันพบว่าโดยพื้นฐานแล้วคุณไม่สามารถอ้างอิง casper จากภายในการevaluate
โทรได้ (เช่นคุณไม่สามารถเปิด url, log, echo ฯลฯ ใหม่ได้) ดังนั้นในกรณีของฉันจึงถูกเรียกใช้การประเมิน แต่ไม่มีทางโต้ตอบกับโลกภายนอก