javascript - 提交简单的表单并在屏幕前后捕获

标签 javascript phantomjs

我正在尝试使用 phantomjs 提交一个简单的表单

这是我的代码

var webPage = require('webpage');
var page = webPage.create();

page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';
page.onLoadFinished = function(){

    page.render("after_post.png");
    console.log("done2!" );
    phantom.exit();

};

page.open('http://localhost/bimeh/phantom/testhtml.php', function(status) {

    page.includeJs("http://code.jquery.com/jquery-latest.min.js", function() {

        page.evaluate(function() {
           $("[name='xxx']").val('okk');
            page.render("pre_post.png");
            console.log('done1!');
            $('#subbtn').click();
        });
    });
});

问题是我没有得到 pre_post.png 图像,她是我的输出

$ phantomjs test.js
done2!

似乎在 page.evaluate 可以执行任何操作之前调用了 onLoadFinished ... 同样在 after_post.png 中,我在提交操作之前获取了表单的图片

我使用的是 phantomjs 1.98(我已经从 2.1 降级了,因为它想要输出错误显然是由于 qt 中的一些错误)

最佳答案

这是错误的:

page.evaluate(function() {
    page.render("pre_post.png"); // <----
});

page.evaluate 就像您在浏览器中加载页面,然后在开发者工具控制台中运行脚本一样。那里没有变量 pagepage 属于 PhantomJS 级别的脚本:

page.open('http://localhost/bimeh/phantom/testhtml.php', function(status) {

    page.includeJs("http://code.jquery.com/jquery-latest.min.js", function() {
        page.render("pre_post.png");

        page.evaluate(function() {
            $("[name='xxx']").val('okk');
            $('#subbtn').click();
        });
    });
});

page.onLoadFinished 每次页面加载完成时调用:PhantomJS 第一次打开脚本和提交表单时第二次。您可以保持功能不变,在这种情况下,如果提交表单,原始页面的第一个屏幕截图将被第二个屏幕截图覆盖。

但是很可能您的表单不会被提交,因为按钮在 PhantomJS 中没有 click 方法,它是在 2.x 中添加的。

您的脚本还缺少一个关键的东西:错误控制。请使用 page.onError 回调来捕获页面上的任何错误(您可以简单地从此处复制函数:http://phantomjs.org/api/webpage/handler/on-error.html)

关于javascript - 提交简单的表单并在屏幕前后捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214376/

相关文章:

javascript - 如何为 Angular 组件注释 ngdoc?

javascript - 当数据满载时如何在表上做一些事情?

javascript - AngularJS 中是否有可能捕获 "load denied by x-frame option"错误?

javascript - 从 Controller 继承隔离范围以创建可重用指令

testing - 错误 : <spyOn> : fetch() method does not exist in PhantomJS

javascript - Pageres (phantomjs) 不返回 promise

javascript - 将 Uint8ClampedArray 缓冲区输出为字节流

javascript - 如何观察 iframe 中 DOM 的变化?

java - 无法从 url 错误 java 获取输入流

jquery - 使用 behat 和 phantomjs 执行 javascript