vitali1995
@vitali1995

Как с помощью nightmare выполнить скрипт перед операцией .end()?

Вызов .then() выполняется только после .end(). Есть заимствованный из PhantomJS метод evaluate, который выполняет скрипт с переменными браузера; туда можно передавать переменные со значением, но с функцией почему-то не передаются (undefined). Задача: выполнить скрипт сервера, передав значение из браузера, и продолжить выполнение по той же схеме.

***

И в дополнение предлагаю занятную задачку.

Пытаюсь с помощью nightmare войти на vk.com, но поле с паролем не получает фокус и не принимает key events. В разметке видно, что на него установлен keyup. Если попытаться его перезаписать в null, то ничего не выйдет, хотя при отладке в свойстве видна функция.

Что это за защита такая, где можно узнать о принципах её действия и как можно её обойти?

nightmare
    .goto('http://vk.com')
    .type('#quick_login', vk.login)
    .type('#quick_pass', vk.pass)
    .click('#quick_login_button')
    .wait(() => {
        return document.title.search(/Диалоги/) != -1;
    })
    .evaluate(() => {
        alert('It`s cool!!!');
    })
    .end()
    .then(()=> {
        console.log('complete!');
    });
  • Вопрос задан
  • 550 просмотров
Решения вопроса 1
@vshvydky
прямое использование nightmare не очень удобно , комфортнее с ним работать внутри генератора
в вашем случае возможно существует проблема блокировки поля ввода контактом, можно пробовать что-то типа .wait(400).type('#quick_login',vk.login).wait(400).type('#quick_pass', vk.pass)...
А еще я вижу, как минимум некорректные айди инпут блоков вк, index_email, index_pass соответственно.
А вообще можно с кошмаром кошмарить так:
function * run() {
  let html = yield nightmare.goto(href);
  let resultEvaluate = yield nightmare.evaluate(()=>{return document.body;});
 yield nightmare.end();

Естественно в таком исполнении все надо оборачивать в try cartch finaly и ловить все ошибки так, иначе любой просроченный wait даст генерацию ошибки.
И еще, в кошмаре отключены алерты, конфирмы и промпты, для их обработки есть отдельные события.
Ваш код может скорее всег озаработать, если его переписать как-то так:
nightmare
    .goto('https://vk.com')
    .type('#index_email', vk.login)
    .type('#index_pass', vk.pass)
    .click('#index_login_button')
    .wait(() => {
        return document.title.search(/Диалоги/) != -1;
    })
    .evaluate(() => {
        return 'its cool!!!';
    })
    .end()
    .then((result)=> {
        console.log(result); // its cool!!!
    })
   .catch(console.error); // будете пренебрегать обработкой ошибок и кошмар будет именно ваш , а не сайта для парсинга....
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы