2017-02-10 17 views
0

Я использую node-horseman в проекте, который создает оповещения в Оповещения Google. Пользователь, который еще не подключился, должен войти в систему со своей учетной записью Google через наше приложение, чтобы затем получить список фидов, который у него есть. Приложение в основном используется для автоматической публикации в новостях на страницах Facebook о любом созданном RSS-канале.Всадник/PhantomJS - Как проверить наличие ошибок и предотвратить создание файлов cookie?

До сих пор функция 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 
    } 
}) 
... 

Он не бросает какие-либо ошибки, не прерывает выполнение и по-прежнему создает плохие куки-файл.

+0

Что этот метод 'this.addError'? Это не метод вашего приложения node.js, не так ли? – Vaviloff

+0

Этот метод находится в моем проекте для хранения ошибок и отображения в пользовательском интерфейсе. Класс операции расширяет базовую операцию, которая имеет этот метод. – mfgabriel92

+0

Вы знаете, как мне помочь? – mfgabriel92

ответ

1

При работе с подобными библиотеками PhantomJS очень важно получить концепцию двух основных различных контекстов: один - это контекст скрипта (который вы пишете для автоматизации работы с целевым сайтом), а другой - контекст целевой сайт страница. Эти контексты не пересекаются, они имеют разные переменные и возможности.

Все, что происходит внутри 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) 
    { 
    // ... 
    } 
}) 

смотрите документацию по использованию оценки в Всадника: https://github.com/johntitus/node-horseman#evaluatefn-arg1-arg2

+1

Лично мне трудно доверять таким конструкциям: '.click ('# signIn'). Wait (3000) .close()' Что делать, если 3 секунды недостаточно? Что делать, если целевой сайт изменяет имена полей и/или добавляет новые поля? В PhantomJS есть onLoadFinished callback, который вызывается каждый раз, когда страница загружается - таким образом можно проверить, был ли пользователь, например, зарегистрирован или был отклонен. – Vaviloff

+0

Это помогло мне, но этот всадник сложный, потому что вещь, которая должна работать, не работает. Я не знаю, как вернуть в контроллер любое сообщение об ошибке, оно продолжает показывать ошибки ... презренные. – mfgabriel92

+0

Ну, если ответ * сделал * помог вам, почему бы не упредить и не принять? Я потратил время, написав это для вас :) Что касается всадника ...это удобно для некоторых простых задач и для тестирования интеграции, где вы контролируете envirionment на 100%, но для сложного соскабливания я бы пошел на что-то более низкоуровневое, например raw PhantomJS или [node-phantom-simple] (https: // github .com/baudehlo/узел-фантомным простой). – Vaviloff