Javascript 为什么我没有收到phantomjs页面响应?

Javascript 为什么我没有收到phantomjs页面响应?,javascript,phantomjs,Javascript,Phantomjs,我正在尝试使用phantomjs(Windows上的1.9.1版)访问一些QUnit测试URL。我在一家公司的网站上使用代理,但我试图访问的URL是从我的本地开发工作站提供的,此外,我甚至尝试在没有必要的代理设置的情况下使用其他两个浏览器(Hv3和Dooble)访问相同的URL,即使它们无法执行QUnit javascript,它们也会得到HTML响应 因此,我甚至尝试将javascriptEnabled设置(加上另外两个设置,请参见下面的代码)调整为false,以获取原始HTML,但没有效果。

我正在尝试使用phantomjs(Windows上的1.9.1版)访问一些QUnit测试URL。我在一家公司的网站上使用代理,但我试图访问的URL是从我的本地开发工作站提供的,此外,我甚至尝试在没有必要的代理设置的情况下使用其他两个浏览器(Hv3和Dooble)访问相同的URL,即使它们无法执行QUnit javascript,它们也会得到HTML响应

因此,我甚至尝试将javascriptEnabled设置(加上另外两个设置,请参见下面的代码)调整为false,以获取原始HTML,但没有效果。我已将对page.open的调用包装在一个try/catch中,但显然这不是因为异常;而是在最后一个phantom.exit()语句执行之前的console.log语句

此外,我还遵循了一些建议,包括从page.onResourceRequested、page.onError和page.onResourceReceived进行日志记录,并且只执行onResourceReceived的回调。我指定了--proxy type=none命令行参数,但都没有用

代码和输出如下,提前感谢。我不知所措;也许是幻影的问题?只是想在报告之前排除一切可能

代码:

输出:

XSSAuditingEnabled: false
javascriptCanCloseWindows: true
javascriptCanOpenWindows: true
javascriptEnabled: true
loadImages: true
localToRemoteUrlAccessEnabled: true
userAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
webSecurityEnabled: false
Request {
    "headers": [
        {
            "name": "User-Agent",
            "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"
        },
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        }
    ],
    "id": 1,
    "method": "GET",
    "time": "2013-07-12T09:49:58.262Z",
    "url": "http://local.example.com:9001/test/workflow"
}
before exit
workflow
workflow.cloning
utils.trains
utils.stations
models.trains.processors
models.stations
gis
fp
flow
ds
page.open()
是异步的。因此,带有
phantom.exit()
的行将在加载页面之前执行,这将停止PhantomJS进程。将
phantom.exit()
移动到
page.open()的回调中,并将其放置在回调的末尾(即,在处理代码之后)。所以基本上你会有这个:

page.open('http://local.example.com:9001/test/workflow', function() {
      console.log('page opened');

      phantom.exit();
});
page.open()
是异步的。因此,带有
phantom.exit()
的行将在加载页面之前执行,这将停止PhantomJS进程。将
phantom.exit()
移动到
page.open()的回调中,并将其放置在回调的末尾(即,在处理代码之后)。所以基本上你会有这个:

page.open('http://local.example.com:9001/test/workflow', function() {
      console.log('page opened');

      phantom.exit();
});

我只是想在这里赎罪自己是个笨蛋,忘记了对page.open的回调是异步执行的。正如我接受的答案的评论中提到的,我不愿意在回调中调用phantom.exit(),因为我实际上需要在循环中进行调用

下面是通过闭包实现这一点的方法,包括使用try/catch来确保始终调用phantom.exit()

注意:而不是声明

page = require('webpage').create()
在顶部,我们只创建对webpage模块的引用,然后在每次循环迭代时将webpage.create()传递到闭包中

代码:

输出:

XSSAuditingEnabled: false
javascriptCanCloseWindows: true
javascriptCanOpenWindows: true
javascriptEnabled: true
loadImages: true
localToRemoteUrlAccessEnabled: true
userAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
webSecurityEnabled: false
Request {
    "headers": [
        {
            "name": "User-Agent",
            "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"
        },
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        }
    ],
    "id": 1,
    "method": "GET",
    "time": "2013-07-12T09:49:58.262Z",
    "url": "http://local.example.com:9001/test/workflow"
}
before exit
workflow
workflow.cloning
utils.trains
utils.stations
models.trains.processors
models.stations
gis
fp
flow
ds

我只是想在这里赎罪自己是个笨蛋,忘记了对page.open的回调是异步执行的。正如我接受的答案的评论中提到的,我不愿意在回调中调用phantom.exit(),因为我实际上需要在循环中进行调用

下面是通过闭包实现这一点的方法,包括使用try/catch来确保始终调用phantom.exit()

注意:而不是声明

page = require('webpage').create()
在顶部,我们只创建对webpage模块的引用,然后在每次循环迭代时将webpage.create()传递到闭包中

代码:

输出:

XSSAuditingEnabled: false
javascriptCanCloseWindows: true
javascriptCanOpenWindows: true
javascriptEnabled: true
loadImages: true
localToRemoteUrlAccessEnabled: true
userAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
webSecurityEnabled: false
Request {
    "headers": [
        {
            "name": "User-Agent",
            "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"
        },
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        }
    ],
    "id": 1,
    "method": "GET",
    "time": "2013-07-12T09:49:58.262Z",
    "url": "http://local.example.com:9001/test/workflow"
}
before exit
workflow
workflow.cloning
utils.trains
utils.stations
models.trains.processors
models.stations
gis
fp
flow
ds

谢谢,这当然很有意思。我的想法是,我不希望phantom.exit()与page.open回调在同一块中,因为我实际上希望连续打开几个页面。我想我可以找到一种方法,使用闭包并递减计数器。@GeorgeJempty异步操作会有点棘手,但确实有办法做到这一点。即使有多个异步操作,您也只需要知道何时达到停止条件。正如你所建议的那样,你可以用多种方式来偿还。谢谢,这当然会起作用。我的想法是,我不希望phantom.exit()与page.open回调在同一块中,因为我实际上希望连续打开几个页面。我想我可以找到一种方法,使用闭包并递减计数器。@GeorgeJempty异步操作会有点棘手,但确实有办法做到这一点。即使有多个异步操作,您也只需要知道何时达到停止条件。正如你所建议的,你可以用多种方式来偿还。