我正在用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)。奇怪的是,错误消息表明文件本身无法打开。
答案 0 :(得分:0)
(暂时不说:我认为第14行有一个剪切和粘贴错误。我相信您希望#{url}
代替#{page.reason_url}
。)
我在这里看到两个问题,或者一个问题在几个方面表现出来。
page.open
方法是异步的 - 这就是它接受回调函数(你的(status)->...
内容)的原因。
导致代码出现两类问题:
第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()
将使您的程序适用于单网址。
即使回调中包含page.render(output)
,当您的程序传递多个网址时,您仍然会遇到问题。同样,因为phantom.exit
是异步的,所以您可以快速连续多次有效地调用page.open
(然后在加载所有这些页面之前退出)。
此外,像普通的单一网络浏览器标签一样,幻影的page.open
对象无法一次打开多个网页。
要修复您的计划,需要确保(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
这似乎适合我。