Tôi đang tích hợp trình duyệt không đầu PhantomJS vào một dự án của tôi (hiện đang sử dụng phiên bản 1.6). Đối với hầu hết các phần, nó đang làm một công việc tuyệt vời tại hoàn thành mà tôi cần phải thực hiện. Tuy nhiên, tính chất không đồng bộ của cách gọi WebPage.open() hoạt động và cần gọi phantom.exit() tại một số điểm, làm cho nó khó xử lý các chuyển hướng phía máy khách khi bạn không thể dự đoán được chúng sẽ đi đâu đi.Cách kết thúc tập lệnh PhantomJS chỉ sau khi chuyển hướng phía máy khách đã diễn ra
Những gì tôi theo sau là cách gọi phantom.exit() chỉ sau khi làm mới meta (dẫn đến một trang khác) và chuyển hướng JavaScript gắn liền với những thứ như sự kiện onload đã được thực thi. Tôi có thể thấy lý do tại sao đây là vấn đề, bởi vì theo lý thuyết, chuyển hướng phía khách hàng có thể diễn ra bất kỳ số giây nào sau khi tải trang và tôi không thể yêu cầu khả năng thoát chỉ khi không có thêm chuyển hướng đang thực hiện diễn ra. Ngay bây giờ, giải pháp tốt nhất tôi có thể nghĩ đến là a) tự phát hiện sự hiện diện của các phần tử làm mới meta trên trang và xử lý với chính chúng, và b) sử dụng setInterval() để cho phép một lượng thời gian lành mạnh (ví dụ, 1- 1,5 giây) để trôi qua trước khi gọi phantom.exit(). Về cơ bản nó sẽ trông giống như sau:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
Có ý tưởng nào tốt hơn không?
Chỉnh sửa: Tôi nên đề cập rằng suy nghĩ đầu tiên của tôi là có thể xảy ra sự kiện PhantomJS khi JavaScript được liên kết với tải trang ban đầu đã được thực hiện, nhưng cuộc gọi lại onLoadFinished xuất hiện trước khi thực hiện bất kỳ JavaScript trang, bao gồm cả sự kiện tải. Tôi cũng đã thực hiện một số thử nghiệm về khoảng thời gian mà tôi có thể đợi, và trong khi 1000 ms đủ dài để chuyển hướng JavaScript (thông qua sự kiện tải trọng cơ thể) được thực thi trong một trang thử nghiệm nhỏ, 100 ms không đủ dài.
Tôi đã sử dụng cùng một cách tiếp cận trong dự án của mình, tức làthêm một chút tạm dừng giữa các cuộc gọi. Tôi e rằng đó là lựa chọn duy nhất (hiện tại). –