Javascript Casperjs ajax调用-waitForResource和解析错误

Javascript Casperjs ajax调用-waitForResource和解析错误,javascript,ajax,casperjs,Javascript,Ajax,Casperjs,Casperjs是一个很棒的工具。我已经能够理解某些基本知识。然而,我试图解决两个问题。首先,出于关闭原因,我将代码拆分为几个函数。我得到一个解析错误。我已经将选项添加到verbose:true,logLevel:“debug”中,看看它是否指出了行号,但我没有得到任何结果。其次,我想进行一个ajax调用,它是异步的。我正在使用waitFor,但我阅读这篇文章是为了找到一种更有效的方法。如何设置waitForResource()来跟踪AJAX请求?以及如何显示解析错误行 代码 var url=[

Casperjs是一个很棒的工具。我已经能够理解某些基本知识。然而,我试图解决两个问题。首先,出于关闭原因,我将代码拆分为几个函数。我得到一个解析错误。我已经将选项添加到
verbose:true,logLevel:“debug”
中,看看它是否指出了行号,但我没有得到任何结果。其次,我想进行一个ajax调用,它是异步的。我正在使用
waitFor
,但我阅读这篇文章是为了找到一种更有效的方法。如何设置
waitForResource()
来跟踪AJAX请求?以及如何显示解析错误行

代码

var url=[]http://9gag.tv/'];
var casper=require('casper')。创建({
没错,
日志级别:“调试”
});
函数getNumberOfItems(casper){
返回casper.getElementsInfo(“.listview.badge网格项”).length;
}
函数tryAndScroll(casper){
casper.page.scrollPosition={top:casper.page.scrollPosition[“top”]+4000,左:0};
var info=casper.getElementInfo('.badge-post-grid-load-more');
如果(信息可见){
var curItems=getNumberOfItems(casper);

如果(curItems您的代码有很多问题

1.语法错误 CasperJS和PhantomJS本身不会告诉您语法错误在哪里,但它可能在第
行中(var i=0,i
。将
更改为
。这一行中没有定义
页面链接
。您可能是指
x

未来:CasperJS脚本是纯JavaScript。您可以使用在线工具,如查找此类错误(以及代码中的其他问题)

还有一个错位的
localhost

2.
有许多含义,具体取决于它的位置

a) 全局

以最后一行为例:

casper.run(stringifyResult.call(this, urls));
在所有函数之外。因此它指的是
窗口
(是的,有两个独立的
窗口
对象,一个在页面上下文内部,一个在外部)。它不指您可能期望的
casper
。使用:

casper.run(stringifyResult.call(casper, urls));
(^非最终代码:见6。)

b) jQuery回调
的内部:

success: function (data) {
    this.echo("All done.");
    return this.exit();
},
指jQuery的
jqXHR
对象(顺便说一句,你也不能从函数内部的异步函数返回一些东西)。它与CasperJS无关。此外,从页面上下文(在
casper.evaluate()内部)调用CasperJS函数是不可能的,因为页面上下文是沙盒。它无法访问外部定义的变量(包括
linksArr
server
)。有关详细信息,请参阅

3.不必要的
waitFor
您的
waitFor
永远不会完成,但您可能是这样设计的,以便发送AJAX请求。问题是,相同的中断请求将每隔20毫秒发送一次

4.发送AJAX请求 CasperJS提供了一个实用程序,用于在页面上下文中发送AJAX请求:。默认情况下,它还会阻止执行,因此无需以越界方式等待请求

function stringifyResult(webpages){
    var linksArr = linkScraper.call(this, webpages);

    //send results to php page
    server = "http://localhost:8181/hashtag_pull/lib/9GagPrivateApi.php";
    this.evaluate(function(server, linksArr){
        __utils__.sendAJAX(server, "POST", JSON.stringify(linksArr));
    }, server, linksArr);
}
(^非最终代码:见5。)

5.从异步函数返回 所有
then*
wait*
CasperJS函数都是异步的。通过调用它们,可以将相关步骤安排在当前步骤结束时执行

这意味着您无法从
linkScraper
返回某些内容,因为它包含异步代码。或者至少您无法返回最终结果,因为它们由异步代码填充。但是,您可以返回最终将包含结果的数组

一种可能的修复方法是将联合收割机调用移到
linkScraper
之外:

function linkScraper(x){
    var page_links = [];
    var youtube = [];
    // here are asynchronous calls
    return {pl: page_links, yt: youtube};
}
function stringifyResult(webpages){
    var linksObj = linkScraper.call(this, webpages);
    // here linksObj contains empty lists
    this.then(function(){
        // here linksObj contains populated lists
        var linksArr = combineArrays(linksObj.pl, linksObj.yt);

        server = "http://localhost:8181/hashtag_pull/lib/9GagPrivateApi.php";
        this.evaluate(function(server, linksArr){
            __utils__.sendAJAX(server, "POST", JSON.stringify(linksArr));
        }, server, linksArr); 
    });
}
6.
退出
casper.exit()

通过不提供对
casper.run()
的回调,可以避免调用
casper.exit()
。如果提供这样的回调,则在执行所有步骤时不会自动退出

casper.then(stringifyResult.call(casper, urls)).run();

你的代码有很多问题

1.语法错误 CasperJS和PhantomJS本身不会告诉您语法错误在哪里,但它可能在第
行中(var i=0,i
。将
更改为
。这一行中没有定义
页面链接
。您可能是指
x

未来:CasperJS脚本是纯JavaScript。您可以使用在线工具,如查找此类错误(以及代码中的其他问题)

还有一个错位的
localhost

2.
有许多含义,具体取决于它的位置

a) 全局

以最后一行为例:

casper.run(stringifyResult.call(this, urls));
在所有函数之外。因此它指的是
窗口
(是的,有两个独立的
窗口
对象,一个在页面上下文内部,一个在外部)。它不指您可能期望的
casper
。使用:

casper.run(stringifyResult.call(casper, urls));
(^非最终代码:见6。)

b) jQuery回调
的内部:

success: function (data) {
    this.echo("All done.");
    return this.exit();
},
指jQuery的
jqXHR
对象(顺便说一句,你也不能从函数内部的异步函数返回一些东西)。它与CasperJS无关。此外,从页面上下文(在
casper.evaluate()内部)调用CasperJS函数是不可能的,因为页面上下文是沙盒。它无法访问外部定义的变量(包括
linksArr
server
)。有关详细信息,请参阅

3.不必要的
waitFor
您的
waitFor
永远不会完成,但您可能是这样设计的