В Phantomjs есть два очень удобных обратных вызова onLoadStarted
и onLoadFinished
, которые позволяют вам приостановить выполнение во время загрузки страницы. Но я искал и не могу найти эквивалент, если вы click()
кнопку отправки или гиперссылку. Происходит аналогичная загрузка страницы, но onLoadStarted
не вызывается для этого события, я думаю, потому что не происходит явного page.open()
. Я пытаюсь найти чистый способ приостановить выполнение, пока происходит эта загрузка.
Одно решение, очевидно, является вложенным setTimeout, но я хотел бы избежать этого сценария, потому что он хакерский и основан на пробах и ошибках, а не на чем-то надежном и более надежном, например, на тестировании или ожидании события.
Есть ли конкретный обратный вызов для такого рода загрузки страницы, который я пропустил? Или, может быть, есть какой-то общий шаблон кода, который может справиться с такими вещами?
РЕДАКТИРОВАТЬ:
Я до сих пор не понял, как поставить его на паузу. Вот код, который не вызывает функцию 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(), в противном случае она будет отображаться немедленно, и я увижу только введенные учетные данные до перенаправления страницы. Может я что-то еще упускаю?
onLoadStarted
иonLoadFinished
. Вы должны сделать это доevaluate
и готовый обработчик должен содержатьrender
- person Artjom B.   schedule 11.10.2014click()
с самого начала. Однако их вызывают для каждогоpage.open()
. - person Jpaji Rajnish   schedule 11.10.2014exit
слишком рано. Пожалуйста, посмотрите последний фрагмент в моем ответе. Работает ли это для вас? - person Artjom B.   schedule 11.10.2014