2015-09-16 1 views
1

Я пытаюсь войти в facebook с помощью phantomJS, она работает нормально, но когда я запустил ее, не отправляйте форму.Форма входа в систему phantomJS не полностью отправлена ​​

Открывает страницу, заполняет поля, но не отправляет. Я попробовал консоль, чтобы увидеть, как она отправляет его обратно, а затем отправляется.

var page = require('webpage').create(); 
var system = require('system'); 
var stepIndex = 0; 
var loadInProgress = false; 

email = system.args[1]; 
password = system.args[2]; 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log("load started"); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log("load finished"); 
}; 

var steps = [ 
    function() { 
     page.open("http://www.facebook.com/login.php", function(status) { 
      page.evaluate(function(email, password) { 
       document.querySelector("input[name='email']").value = email; 
       document.querySelector("input[name='pass']").value = password; 

       document.querySelector("#login_form").submit(); 

       console.log("Login submitted!"); 
      }, email, password); 
      page.render('output.png'); 
     }); 
    }, 
    function() { 
     console.log(document.documentElement.innerHTML); 
    }, 
    function() { 
     phantom.exit(); 
    } 
] 

setInterval(function() { 
    if (!loadInProgress && typeof steps[stepIndex] == "function") { 
     console.log("step " + (stepIndex + 1)); 
     steps[stepIndex](); 
     stepIndex++; 
    } 
    if (typeof steps[stepIndex] != "function") { 
     console.log("test complete!"); 
     phantom.exit(); 
    } 
}, 10000); 

ответ

1

У вас есть как минимум две проблемы.

  • После представления формы, как правило, берет на себя некоторые сетевые запросы, результат не будет доступен сразу, но вы при условии, что он будет сразу же доступны, потому что вы сразу же делает скриншот, чтобы увидеть, что произошло , Этот скриншот не покажет вам страницу после отправки. Он покажет вам страницу во время отправки. Вам нужно перенести рендеринг на следующий шаг, когда результат отправки поступит в браузер.

  • document не имеет значения вне контекста страницы. Тем не менее PhantomJS предоставит такой фиктивный объект. Вы можете получить доступ только к DOM (document и window) внутри page.evaluate().

Попробуйте

var steps = [ 
    function() { 
     page.open("http://www.facebook.com/login.php", function(status) { 
      page.evaluate(function(email, password) { 
       document.querySelector("input[name='email']").value = email; 
       document.querySelector("input[name='pass']").value = password; 

       document.querySelector("#login_form").submit(); 

       console.log("Login submitted!"); 
      }, email, password); 
     }); 
    }, 
    function() { 
     page.render('output.png'); 
     console.log("innerHTML: " + page.evaluate(function(){ 
      return document.documentElement.innerHTML; 
     })); 
     console.log("full page: " + page.content); 
    }, 
    function() { 
     phantom.exit(); 
    } 
] 
+0

Спасибо за тонну, Вы прекрасны, когда я упомянул страницу в другой функции я получаю страница не является переменной/Undefine, но ваш работает прекрасно. @Artjom B. –

+0

B, спасибо за большую поддержку. Я могу войти на эту страницу с помощью вашего ответа, но почему он не работает на www.facebook.com для входа в систему. Он работает только на www.facebook.com/login.php –

+0

Я не знаю. Возможно, есть какая-то переадресация, которую PhantomJS не может выполнить. –