2017-02-10 7 views
0

Google 알리미에서 RSS 알리미를 만드는 프로젝트에서 node-horseman을 사용하고 있습니다. 아직 연결하지 않은 사용자는 애플리케이션을 통해 자신의 Google 계정에 로그인해야 자신이 보유한 피드 목록을 검색 할 수 있습니다. 이 응용 프로그램은 기본적으로 생성 된 RSS 피드에 대한 Facebook 페이지 뉴스에 자동 게시하는 데 사용됩니다. 아주 간단한말 사범/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와 같은 라이브러리로 작업 할 때 두 가지 주요 컨텍스트의 개념을 얻는 것이 중요합니다. 하나는 스크립트 컨텍스트 (대상 사이트를 자동화하기 위해 작성)이고 다른 하나는 컨텍스트입니다. 대상 사이트의 페이지. 교차하지 않는 이러한 컨텍스트에는 다양한 변수와 기능이 있습니다.

page.evaluate()의 모든 일이 브라우저 페이지의 컨텍스트에서 발생합니다. 해당 사이트의 (Chrome | Firefox | Safari) 브라우저의 콘솔에서 실행중인 코드를 실제로 시각화 할 수 있습니다.

당신은 구글 로그인 페이지

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) 
    { 
    // ... 
    } 
}) 

가 기수에 평가 사용에 대한 문서를 참조하십시오 쓸 수있는 대신

: https://github.com/johntitus/node-horseman#evaluatefn-arg1-arg2

+1

개인적으로 나는 그런 구조를 신뢰하기가 어렵다. : .click ('# signIn'). wait (3000) .close()'3 초가 충분하지 않다면? 대상 사이트가 필드 이름을 변경하거나 새 필드를 추가하면 어떻게됩니까? PhantomJS에는 페이지가로드 될 때마다 호출되는 onLoadFinished 콜백이 있습니다.이 방법은 사용자가 로그인했거나 거절되었는지 여부를 확인할 수 있습니다. – Vaviloff

+0

그것은 도움이되었지만 작동해야하는 것이 작동하지 않기 때문에이 말사가 복잡합니다. 내 컨트롤러에 오류 메시지를 반환하는 방법을 모르겠지만 오류를 계속 보여줍니다 ... 비열합니다. – mfgabriel92

+0

답변이 도움이된다면, 왜 upvote하지 않고 동의합니까? 나는 당신을 위해 그것을 쓰는 시간을 보냈다 :) 기수에 관해서는 ...몇 가지 간단한 작업과 envirionment 100 %를 제어하는 ​​통합 테스팅에는 편리하지만, 복잡한 스크래핑을 위해서는 Raw PhantomJS 나 [노드 팬텀 단순] (https : // github .com/baudehlo/node-phantom-simple). – Vaviloff