Coffeescript 幻影可以';无法打开文件名

Coffeescript 幻影可以';无法打开文件名,coffeescript,screenshot,phantomjs,Coffeescript,Screenshot,Phantomjs,我正在用phantomjs编写一点咖啡脚本来截图多个URL。但每次我尝试运行它时,都会收到一条错误消息,无法打开。有什么好处?这是我的密码: page = require('webpage').create() page.viewportSize = width: 1024 height: 760 urls = phantom.args i = 1 for url in urls do (url) -> output = "scr

我正在用phantomjs编写一点咖啡脚本来截图多个URL。但每次我尝试运行它时,都会收到一条错误消息,
无法打开
。有什么好处?这是我的密码:

  page = require('webpage').create()

  page.viewportSize =
    width: 1024
    height: 760

  urls = phantom.args
  i = 1
  for url in urls
    do (url) ->
      output = "screenshot-#{i}.png"
      page.open url, (status) ->
        if status isnt 'success'
          console.log "Error opening url \"#{page.reason_url}\": #{page.reason}"
          phantom.exit(1)
        else
          console.log "Page opened.."
          window.setTimeout (->
            page.clipRect =
              top: 0
              left: 0
              width: 1024
              height: 760
            page.render(output)
          ), 200
      i += 1

  phantom.exit()
我试着注释一些内容,但似乎失败的部分是page.open(url)。奇怪的是,错误消息说文件本身无法打开。

(顺便说一句:我认为第14行有剪切和粘贴错误。我相信您希望用
{url}
代替
{page.reason\u url}

我在这里看到两个问题,或者一个问题在几个方面表现出来

page.open
方法是异步的——这就是为什么它接受回调函数(您的
(status)->…
东西)

这会导致代码出现两种类型的问题:

  • 第28行的
    phantom.exit()
    调用超出了
    for
    循环(从第9行开始)和回调方法(从第12行开始)的范围

    因为
    open
    调用是异步的,当
    url
    ['http://google.com“]
    ,的
    循环将调用
    页。打开('http://google.com/)
    然后在页面完成加载或调用回调之前跳转到
    phantom.exit()

    您需要延迟
    phantom.exit()
    调用,直到
    page.render(output)
    方法完成。在--
    page.render(output)
    之后移动
    phantom.exit()

  • 即使在回调中使用
    phantom.exit
    ,当多个URL被传递到您的程序时,您仍然会遇到问题。同样,由于
    page.open
    是异步的,因此您可以快速连续多次调用
    page.open
    (然后在加载所有这些页面之前退出)

    此外,与常规的单一web浏览器选项卡一样,Phantom的
    页面
    对象不能一次打开多个页面

  • 要修复程序,需要确保(a)在转到下一个URL之前加载并呈现了一个URL,以及(b)在呈现所有URL之前,不要调用
    phantom.exit()

    有几种方法可以实现这一点(谷歌搜索“nodejs异步for loop”或类似的东西),但根据您的需要,每次调用程序只呈现一个页面可能更容易

    以下是您的程序版本,针对PhantomJS 2进行了更新,设置为只呈现一个URL:

    system=require('system'))
    page=require('webpage')。create()
    page.viewportSize=
    宽度:1024
    身高:760
    url=system.args[2]
    output=“屏幕截图-#{Date.now()}.png”
    page.open url,(状态)->
    如果状态不是“成功”
    console.error“错误打开url\”#{url}\:#{page.reason}”
    幻影。出口(1)
    其他的
    console.log“页面已打开…”
    window.setTimeout(->
    page.clipRect=
    排名:0
    左:0
    宽度:1024
    身高:760
    页面渲染(输出)
    console.log“页面呈现…”
    幻影。退出()
    ), 200
    
    因为Phantom不再直接解析CoffeeScript,所以要运行它,首先需要“编译”到JavaScript,如下所示:

    coffee-c foo.coffee
    phantomjs foo.js“http://www.google.com/"
    

    这似乎对我很有效。

    您是否尝试将“”作为第一个url附加?可能错误消息是有效的。是的,我尝试直接输入字符串,但似乎不起作用:(尝试硬编码?如
    url=['http://google.com“]
    这似乎也不起作用。我用一个简单的
    page.open就把它压缩到了最低限度”http://www.google.com“,(状态)->console.log”-->{status}”
    但我得到了同样的错误
    无法打开'test.js.coffee'
    我开始认为phantomjs的open方法有什么问题。我认为归结起来就是这段代码不起作用:
    page.open('http://github.com/“,(status)->console.log(“status:{status}”)page.render('github.png'))