javascript - 如何依次打开几个页面(PhantomJS)?

标签 javascript phantomjs

正如我所见,你不能只在一个 phantomjs 脚本中使用 page.open() 打开几个页面。因为他们开始同时工作。我尝试了 seTtimeout() 的变体,但它们不起作用。所以我需要的是打开第一页,执行一些操作,然后关闭它。之后我需要打开另一个页面。我怎样才能做到这一点?

var url = 'url-address-';
var referrer = '-url-address-/path';
page.customHeaders={'Authorization': 'Basic '+btoa(login+":"+password), 'Referer': referrer};

page.open(url, function(status){
    if(status === 'fail')
    {
        console.log('Status: ' + status);
        phantom.exit();
    }

    console.log('Status: ' + status);
    page.render("1.png");

    page.evaluate(function() {
        var form = document.forms[0];   
        form.data1.value = 'mydata_name';
        form.data2.value = 'mydata_surname';
        form.submit();
    }); 

    setTimeout(function(){
        var url = 'post-url-address';
        var referrer = '-url-address-/refpath';
        page.customHeaders={'Authorization': 'Basic '+btoa(login+":"+password), 'Referer': referrer};   
        body = 'submit-url=mydata_to_submit';
        page.open(url, 'POST', body, function (status) {
            //
            // Here goes the error 
            // unable to load url: "post-url-address"
            //  error code: 5, description: Operation canceled
            //
            //
            //setTimeout(function(){}, 5000)
            console.log('Status: ' + status);
        }); 

        page.render("2.png");
        var fs = require('fs');
        fs.write(result, page.content, 'w');
        console.log('Finished');
        phantom.exit();

    }, timeout);
});

所以一切都很顺利,直到我打开页面来发布数据。不知道为什么会这样。尝试将超时更改为 20-30 秒 - 问题仍然存在。为什么会发生这种情况并不明显,不是吗?

最佳答案

你退出得太早了。

打开第二页后,您将脱离控制流。您必须将文件写入和退出移至 page.open() 回调中。发生该错误的原因可能是 PhantomJS 当前正在尝试下载页面,同时尝试退出执行。这就是第二个页面加载被取消的原因。

用途:

// second page.open ...
page.open(url, 'POST', body, function (status) {
    console.log('Status: ' + status);
    page.render("2.png");
    var fs = require('fs');
    fs.write(result, page.content, 'w');
    console.log('Finished');
    phantom.exit();
}); 

关于javascript - 如何依次打开几个页面(PhantomJS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568918/

相关文章:

google-chrome - 如何使用 Chrome 远程调试 CasperJS?

javascript - jQuery 没有在 CasperJS 的 evaluate() 函数中做任何事情

javascript - 使用 CasperJS 删除 DOM 元素

Javascript - 排列和可能性

javascript - 实时表编辑其他 mySQL 表中的显示字段

javascript - JavaScript 中的最短路径

java - 测试完成后如何杀死在后台运行的 phantomjs 进程

javascript - 互斥的复选框逻辑

javascript - 如何使用js将新标签添加到jquery对话框中?

javascript - Phantomjs 呈现错误的快照大小