Phantomjs có hai callbacks thực sự tiện dụng này onLoadStarted
và onLoadFinished
cho phép bạn tạm dừng thực thi trong khi trang đang tải. Nhưng tôi đã tìm kiếm và tôi không thể tìm thấy tương đương nếu bạn click()
nút hoặc liên kết gửi. Tải trang tương tự xảy ra nhưng onLoadStarted
không được gọi cho sự kiện này tôi đoán vì không xảy ra sự cố rõ ràng page.open()
. Tôi đang cố gắng tìm ra một cách rõ ràng để đình chỉ thực hiện trong khi tải này diễn ra.Làm cách nào để đợi sự kiện click() tải trong các bóng ma trước khi tiếp tục?
Một giải pháp rõ ràng là lồng nhau setTimeout nhưng tôi muốn tránh trường hợp này vì nó hacky và dựa vào thử và sai thay vì một cái gì đó đáng tin cậy và mạnh mẽ hơn như thử nghiệm chống lại một cái gì đó hoặc chờ đợi một sự kiện.
Có một cuộc gọi lại cụ thể cho loại tải trang mà tôi đã bỏ lỡ không? Hoặc có thể có một số loại mẫu mã chung có thể giải quyết được vấn đề này?
CHỈNH SỬA:
Tôi vẫn chưa tìm ra cách để tạm dừng. Dưới đây là đoạn code mà không gọi onLoadStarted()
chức năng khi tôi gọi là click()
lệnh:
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');
Tôi đôi kiểm tra rằng id là đúng. page.render()
sẽ cho biết rằng thông tin được gửi, nhưng chỉ khi tôi đặt nó trong setTimeout(), nếu không nó sẽ hiển thị ngay lập tức và tôi chỉ thấy thông tin đăng nhập được nhập trước khi chuyển hướng trang. Có lẽ tôi đang thiếu cái gì khác?
Bạn chưa thể hiện cách bạn đặt 'onLoadStarted' và' onLoadFinished'. Bạn phải làm điều đó trước khi 'eval' và trình xử lý hoàn tất chứa' render' –
Tôi đã chỉnh sửa nó để bao gồm các định nghĩa gọi lại. Tôi không nghĩ rằng đây là vấn đề mặc dù bởi vì họ không nhận được kêu gọi cho sự kiện 'click()' để bắt đầu. Họ được gọi cho mỗi 'page.open()' mặc dù. –
Có thể bạn 'thoát' quá sớm. Vui lòng xem đoạn cuối cùng trong câu trả lời của tôi. Nó làm việc cho bạn? –