Phantomjs无法打开文件名

时间:2014-02-12 11:50:09

标签: coffeescript screenshot phantomjs

我正在用phantomjs写一些coffeescript来截取多个网址的截图。每次我尝试运行它时,都会收到一条错误消息Can't open <filename>。是什么赋予了?这是我的代码:

  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)。奇怪的是,错误消息表明文件本身无法打开。

1 个答案:

答案 0 :(得分:0)

(暂时不说:我认为第14行有一个剪切和粘贴错误。我相信您希望#{url}代替#{page.reason_url}。)

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

page.open方法是异步的 - 这就是它接受回调函数(你的(status)->...内容)的原因。

导致代码出现两类问题:

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

    由于open调用是异步的,当urls['http://google.com']时,for循环将调用page.open('http://google.com/'),然后跳转到phantom.exit()在页面加载完毕或调用回调之前。

    您需要推迟phantom.exit()来电,直到page.render(output)方法完成。在{ - 1}}之后立即移动phantom.exit()将使您的程序适用于网址。

  2. 即使回调中包含page.render(output),当您的程序传递多个网址时,您仍然会遇到问题。同样,因为phantom.exit是异步的,所以您可以快速连续多次有效地调用page.open(然后在加载所有这些页面之前退出)。

    此外,像普通的单一网络浏览器标签一样,幻影的page.open对象无法一次打开多个网页。

  3. 要修复您的计划,需要确保(a)已加载一个网址page然后转到下一个网址,并且(b)您不会致电rendered直到所有网址都已呈现。

    有几种方法可以解决这个问题(google for&#34; nodejs异步for循环&#34;或类似的东西),但根据您的需要,每次调用时可能更容易渲染一个页面该计划。

    这是您的程序版本,已针对PhantomJS 2进行了更新,并设置为只渲染一个网址:

    phantom.exit()

    由于Phantom不再直接解析CoffeeScript,为了运行它,你需要首先编译&#34;编译&#34;像JavaScript一样:

    system = require('system')
    page = require('webpage').create()
    
    page.viewportSize =
      width: 1024
      height: 760
    
    url = system.args[2]
    output = "screenshot-#{Date.now()}.png"
    page.open url, (status) ->
      if status isnt 'success'
        console.error "Error opening url \"#{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)
          console.log "Page rendered..."
          phantom.exit()
        ), 200
    

    这似乎适合我。