Theo Tài liệu CasperJS :
then()
Chữ ký: then(Function then)
Phương pháp này là cách tiêu chuẩn để thêm một bước điều hướng mới vào ngăn xếp, bằng cách cung cấp một chức năng đơn giản:
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();
Bạn có thể thêm bao nhiêu bước tùy ý. Lưu ý rằng phiên bản hiện tại Casper
tự động liên kết this
từ khóa cho bạn trong các hàm bước.
Để chạy tất cả các bước bạn đã xác định, hãy gọi run()
phương thức và thì đấy.
Lưu ý: Bạn phải thể start()
hiện casper để sử dụng then()
phương thức này.
Cảnh báo: Các hàm bước được thêm vào then()
được xử lý trong hai trường hợp khác nhau:
- khi chức năng bước trước đã được thực thi,
- khi yêu cầu HTTP chính trước đó đã được thực thi và trang được tải ;
Lưu ý rằng không có định nghĩa duy nhất về trang được tải ; đó là khi sự kiện DOMReady đã được kích hoạt? Nó có phải là "tất cả các yêu cầu đang được hoàn thành"? Nó có phải là "tất cả logic ứng dụng đang được thực hiện" không? Hay "tất cả các phần tử đang được kết xuất"? Câu trả lời luôn phụ thuộc vào ngữ cảnh. Do đó, tại sao bạn được khuyến khích luôn sử dụng các waitFor()
phương pháp gia đình để kiểm soát rõ ràng những gì bạn thực sự mong đợi.
Một thủ thuật phổ biến là sử dụng waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Phía sau, mã nguồn củaCasper.prototype.then
được hiển thị bên dưới:
/**
* 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;
};
Giải trình:
Nói cách khác, lập then()
lịch cho bước tiếp theo trong quá trình điều hướng.
Khi then()
được gọi, nó được truyền vào một hàm như một tham số sẽ được gọi như một bước.
Nó kiểm tra xem một phiên bản đã bắt đầu chưa, và nếu chưa, nó sẽ hiển thị lỗi sau:
CasperError: Casper is not started, can't execute `then()`.
Tiếp theo, nó kiểm tra xem page
đối tượng có null
.
Nếu điều kiện là đúng, Casper tạo một page
đối tượng mới .
Sau đó, then()
xác thực step
tham số để kiểm tra xem nó có phải là một hàm hay không.
Nếu tham số không phải là một hàm, nó sẽ hiển thị lỗi sau:
CasperError: You can only define a step as a function
Sau đó, chức năng kiểm tra xem Casper có đang chạy hay không.
Nếu Casper không chạy, hãy then()
thêm bước vào cuối hàng đợi.
Ngược lại, nếu Casper đang chạy, nó sẽ chèn một bước phụ sâu hơn bước trước đó.
Cuối cùng, then()
hàm kết thúc bằng cách tạo ra một step.added
sự kiện và trả về đối tượng Casper.
flow
của casperj, nhưng tôi đã phát hiện ra rằng về cơ bản bạn không thể tham chiếu casper từ bên trongevaluate
cuộc gọi. (tức là bạn không thể mở url mới, nhật ký, tiếng vang, v.v.). Vì vậy, trong trường hợp của tôi, đánh giá đã được gọi nhưng không có cách nào để tương tác với thế giới bên ngoài.