2017-02-10 5 views
0

GoogleアラートにRSSアラートを作成するプロジェクトでnode-horsemanを使用しています。まだ接続していないユーザーは、自分のGoogleアカウントにログインして、自分のフィードリストを取得できるようにする必要があります。このアプリケーションは基本的に、作成されたRSSフィードについてのFacebookのニュースの自動投稿に使用されます。非常にシンプルなHorseman/PhantomJS - エラーをチェックしてクッキーを作成する方法を教えてください。

* 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) 
    }) 
} 

はこれまでのところ、login機能は次のとおりです。ログインして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 
    } 
}) 
... 

それは何らかのエラーが実行を中断し、まだ悪いクッキーファイルを作成しませスローしません。

+0

このメソッドは 'this.addError'何ですか?あなたのnode.jsアプリの方法ではありませんか? – Vaviloff

+0

このメソッドは、エラーを格納してUIに表示する私のプロジェクトです。操作クラスは、このメソッドを持つ基本操作を拡張します。 – mfgabriel92

+0

私を助ける方法を知っていますか? – mfgabriel92

答えて

1

PhantomJSのようなライブラリで作業する場合、2つの主な異なるコンテキストの概念を得ることが非常に重要です.1つはスクリプトのコンテキスト(対象サイトを自動化するために書く)で、もう1つはターゲットサイトのページ。これらのコンテキストは交差しないため、変数と機能が異なります。

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 
    } 

を書くとき、あなたが2つのコンテキストを混入したので、それは、エラーがスローされます。その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) 
    { 
    // ... 
    } 
}) 

を書くことができます:https://github.com/johntitus/node-horseman#evaluatefn-arg1-arg2

+1

個人的に私はそのような構造を信じるのは難しいと思っています: '.click( '#signIn')。wait(3000).close()' 3秒で十分でない場合はどうなりますか?ターゲットサイトがフィールド名を変更したり、新しいフィールドを追加するとどうなりますか? PhantomJSには、ページがロードされるたびに呼び出されるonLoadFinishedコールバックがあります。このようにして、ユーザーがログインしたか拒否されたかどうかを確認できます。 – Vaviloff

+0

それは私を助けましたが、動作するはずのものは動作しないので、この騎手は複雑です。私はどのように私のコントローラにエラーメッセージを返すかわからない、それはエラーを表示し続けて...卑劣な。 – mfgabriel92

+0

答えが*あなたを助けてくれたら、なぜアップヴォートして受け入れるのですか?私はあなたのためにそれを書いて時間を費やした:)馬のために...いくつかの簡単なタスクや、環境を100%コントロールする統合テストのためには便利ですが、複雑なスクレイピングのためには、Raw PhantomJSや[node-phantom-simple](https:// github .com/baudehlo/node-phantom-simple)。 – Vaviloff

関連する問題