2014-02-12 73 views
2

我正在用phantomjs寫一些coffeescript來截取多個網址截圖。每次我嘗試運行它時,都會收到一條錯誤消息,Can't open <filename>。是什麼賦予了?這裏是我的代碼:Phantomjs無法打開文件名

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)。奇怪的錯誤消息說文件本身無法打開。

+0

您是否嘗試追加「http://google.com」作爲第一個網址?也許錯誤信息是有效的。 – jcollum

+0

是的,我嘗試直接輸入一個字符串,它似乎沒有工作:( – DaniG2k

+0

嘗試硬編碼?像'urls = ['http://google.com']' – jcollum

回答

0

(作爲一個快速題外話:我認爲這是在第14行剪切和粘貼錯誤,我相信你代替#{page.reason_url}#{url}。)

我看到兩個問題在這裏,或一個以幾種方式發佈清單。

page.open方法是異步的 - 這就是爲什麼它接受回調函數(你的(status)->...東西)。

這是造成兩種類型的問題,爲您的代碼:

  1. phantom.exit()呼叫第28行是for循環(即開始在第9行)的範圍外,且回調方法(即從第12行開始)。

    因爲open調用是異步的,當urls['http://google.com'],則for循環將調用page.open('http://google.com/'),然後跳轉到phantom.exit()前的頁面加載完成後或調用回調函數。

    您需要推遲您的phantom.exit()呼叫,直至page.render(output)方法完成。移動phantom.exit()之後 - 和 - page.render(output)縮進相同將使您的程序工作爲單個 URL。

  2. 即使在回調中有phantom.exit,如果有多個URL傳遞給程序,仍然會出現問題。同樣,因爲page.open是異步的,所以您可以快速連續多次調用page.open(然後在加載所有這些頁面之前退出)。而且,像普通的單一網頁瀏覽器選項卡一樣,Phantom的page對象不能一次打開多個頁面。

要解決你的程序需要確保(一)一個URL已經在移動到下一個之前加載和rendered,和(b)你不叫phantom.exit(),直到所有的URL都有被渲染。

有幾種方法可以解決這個問題(谷歌的「nodejs異步for循環」或類似的東西),但根據您的需要,可能會更容易只呈現一個頁面調用的程序。

這是你的程序,更新的PhantomJS 2的版本,並設立要準確地表現一個網址:

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 

由於幻影不再直接解析CoffeeScript中,運行此,你需要先「編譯「to JavaScript,像這樣:

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

這似乎對我來說正常工作。