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
我在一个项目上使用 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