【问题标题】:Looping over URLs in Casperjs在 Casperjs 中循环 URL
【发布时间】:2015-01-09 00:53:08
【问题描述】:

我正在尝试使用 Casperjs 按顺序打开几个 URL。

这是我实际代码的简化版本。

casper = require('casper').create()
casper.start()

casper.then () ->
  items = ['http://www.google.com', 'http://www.yahoo.com']

  for item, idx in items
     this.open item
     this.then ((idx) ->
        () ->
            this.capture idx + '.png')(idx)

casper.run()

在我的实际代码中,items 数组是在运行时生成的。我希望这段代码会提供 google.com 和 yahoo.com 的屏幕截图,但实际上这两个屏幕截图都以 yahoo.com 结尾。我觉得这与在循环中创建闭包有关,但我不知道如何。当open 被调用时,item 指的是一个特定的字符串。我永远不会结束它,是吗?

【问题讨论】:

    标签: coffeescript casperjs


    【解决方案1】:

    问题是casper.open 没有添加步骤,所以它不是异步的(如thenOpen)。它立即在外部then 内部执行。但是下面的then 异步的,所以它的步骤被添加到当前步骤之后执行(外部then)。两个opens 都被执行,但是两个thens 的回调都是在最后一个open 之后执行的。

    所以解决方案是使用thenOpen 作为组合异步步骤。直接解决方案有一个小问题:

    CoffeeScript is a little language that compiles into JavaScript.

    这意味着 JavaScript 的误解适用。就是这个:JavaScript closure inside loops – simple practical example

    for item, idx in items 行仍然是 for loop in JavaScript。 JavaScript 具有函数级作用域,casper.then 是一个异步步进函数,这意味着所有 casper.then 调用的回调在循环完全运行后执行(更准确地说是在当前步骤完成后或 casper.run 完成后调用),但casper.open 会立即执行。

    解决方案:将 casper.opencasper.then 组合到 casper.thenOpen 并通过 IIFE 传递 itemidx 以便它们固定到每次迭代:

    for item, idx in items
        ((item, idx) ->
            casper.thenOpen item, () ->
                this.capture idx + '.png'
        )(item, idx)
    

    或使用Array.prototype.forEach:

    items.forEach (item, idx) ->
        casper.thenOpen item, () ->
            this.capture idx + '.png'
    

    【讨论】:

    • 我对coffeescript不是很流利,所以我不确定上面的代码在语法上是否正确。
    • casper.open 不会将打开页面命令添加到步骤堆栈中吗?页面的实际打开发生在casper.run 调用之后,那么为什么会有排序问题呢?正如您所说,我将idx 放入闭包中的原因是因为我希望在运行时保留特定的索引。但是为什么casper.open 调用需要关闭呢?您将它们捆绑在一起的想法奏效了,但我希望您能理解为什么我仍然有些困惑。谢谢
    • 是的,我认为这对我来说不是很清楚。我希望现在更好。
    • "someQueue.push(["open", string])" 不会发生,因为casper.open 不是阶跃函数。它会立即执行,但确实会发生“someQueue.push(["then", func])”,并且会在第二个casper.open 之后执行。所以两个屏幕截图都显示相同的页面。
    • open 在被调用时会立即执行,但它只在外部then 内部调用。如果您查看源代码可能会有所帮助。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多