javascript - PhantomJS Facebook 登录表单未完全提交

标签 javascript facebook web-scraping phantomjs form-submit

我正在尝试通过 phantomJS 登录 facebook,它工作正常,但当我运行它时不提交表单。

它打开页面填充字段但不提交。我尝试控制台查看表单提交,它首先返回未定义,然后提交。

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);

最佳答案

您至少有两个问题。

  • 由于提交表单通常会产生一些网络请求,因此结果不会立即可用,但您假设它会立即可用,因为您会立即渲染屏幕截图以查看发生了什么。该屏幕截图不会显示提交后的页面。它会在提交期间向您显示一个页面。当提交结果到达浏览器时,需要将渲染移至下一步。

  • document 在页面上下文之外没有任何意义。尽管如此,PhantomJS 仍会提供这样一个虚拟对象。您只能访问 page.evaluate() 内部的 DOM(documentwindow)。

尝试

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();
    }
]

关于javascript - PhantomJS Facebook 登录表单未完全提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618157/

相关文章:

javascript - 使用 Javascript 制作电影或幻灯片

javascript - 如何使用 Angular 进行秒数倒计时?

facebook - Open Graph URL 是重定向到页面的永久链接

android - 在 Android 应用程序中显示带有其图像的 Facebook 页面帖子

facebook - 尝试使用 FQL : Why do some friends return an empty set? 读取 Facebook 中的好友链接

python - 无法从网页中获取文本

python - 无法从网页获取少量项目

javascript - 将不同 div 标签内的多个表转换为可排序/可搜索的表

python - 无法抓取《华尔街日报》页面上 "div"类中的数据

javascript - 从选择器创建新元素?