Horseman/PhantomJS - 如何检查错误并防止创建 cookie?

Horseman/PhantomJS - How to check for errors and prevent creating cookies?

我在一个项目上使用 node-horseman,该项目在 Google 警报上创建 RSS 警报。尚未连接的用户必须通过我们的应用程序使用 his/her Google 帐户登录,然后才能检索他拥有的提要列表。该应用程序基本上用于在 Facebook 页面上自动 post 有关创建的任何 RSS 提要的新闻。

到目前为止,login函数如下:

* login() {
  if (!this.email || !this.password) {
    this.addError(HTTPResponse.STATUS_FORBIDDEN, 'E-mail and Password are necessary')

    return false
  }

  const horseman = new Horseman({ cookiesFile })

  return new Promise((resolve, reject) => {
    horseman
      .open('https://accounts.google.com')
      .type('input[type="email"]', this.email)
      .click('#next')
      .wait(1000)
      .type('input[type="password"]', this.password)
      .click('#signIn')
      .wait(3000)
      .close()

    setTimeout(function() {
      resolve(true)
    }, 3000)
  })
}

很简单。它登录并创建一个 cookiesFile 以便能够创建新的提要并检索现有的提要。但这完全不是失败证明,因为无法检查错误,而且我找不到示例或做任何事情。我尝试使用 evaluate() 并检查是否有 .error_msg 标签,但它在 phantomJS Unhandled rejection fn:

中抛出错误
...
.wait(1000)
.evaluate(function() {
  if (jQuery('.error-msg').length > 0) {
    this.addError(HTTPResponse.STATUS_INTERNAL_SERVER_ERROR, 'Error!')
    return false
  }
})
...

它不会抛出任何错误,不会中断执行,但仍然会创建一个错误的 cookie 文件。

在使用 PhantomJS-like 库时,了解两个主要不同上下文的概念非常重要:一个是脚本的上下文(您编写脚本是为了自动处理目标站点),另一个是目标站点 页面 的上下文。这些上下文不相交,它们具有不同的变量和功能。

page.evaluate() 中发生的一切都发生在 浏览器页面 的上下文中。实际上,您可以将该代码可视化为在该站点的 (Chrome|Firefox|Safari) 浏览器的控制台中执行。

您可以在 Google 登录页面的控制台中执行此操作

if (jQuery('.error-msg').length > 0) {
   // ...
}

但是当你写的时候

  if (jQuery('.error-msg').length > 0) {
    this.addError(HTTPResponse.STATUS_INTERNAL_SERVER_ERROR, 'Error!')
    return false
  }

它会抛出一个错误,因为你混合了两个上下文。 Google 页面上没有 .addError 方法,它在您的脚本上下文中。

你可以这样写

.evaluate(function() {
  if (jQuery('.error-msg').length > 0) {
    return { 
      errors : jQuery('.error-msg').length,
      message : "Some message about errors"
    }
  }
})
.then(function(result){
  if(result.errors > 0)
  {
     // ...
  }
})

请参阅有关在 Horseman 中使用评估的文档:https://github.com/johntitus/node-horseman#evaluatefn-arg1-arg2