Phantomjs имеет эти два действительно полезных обратных вызова onLoadStarted
и onLoadFinished
, которые позволяют существенно приостановить выполнение во время загрузки страницы. Но я искал, и я не могу найти эквивалент, если вы click()
кнопку отправки или гиперссылку. Подобная загрузка страницы происходит, но onLoadStarted
не вызывается для этого события, я думаю, потому что не существует явного page.open()
, который происходит. Я пытаюсь найти чистый способ приостановить выполнение во время загрузки.
Одно из решений, очевидно, вложенное setTimeout, но я бы хотел избежать этого сценария, потому что он взломал и полагался на пробную версию и ошибку вместо надежного и более надежного, как тестирование на что-то или ожидание события.
Существует ли конкретный обратный вызов для такого типа загрузки страницы, который я пропустил? Или может быть какой-то общий шаблон кода, который может справиться с такими вещами?
EDIT:
Я до сих пор не понял, как заставить его остановиться. Здесь код, который не вызывает функцию onLoadStarted()
, когда я вызываю команду click()
:
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');
Я дважды проверил, что идентификатор верен. page.render()
покажет, что информация отправлена, но только если я помещаю ее в setTimeout(), в противном случае она отображает ее немедленно, и я вижу только учетные данные, введенные до перенаправления страницы. Может, мне не хватает чего-то другого?