1

Я пытаюсь создать скрипт с помощью ночных кошмаров, которые могли бы снова и снова нажимать кнопку, например, эту кнопку в нижней части раздела комментариев, которая загружает старые комментарии при каждом нажатии (пример: youtube.com/watch?v=pZISJqJbQuU & list = RDpZISJqJbQuU # t = 3) и остановите, когда больше кнопки не будет нажата.Проблемы с асинхронностью с NightmareJS

Я попытался вызывать оценку, только для того, чтобы метод end() был вызван первым и отменил процесс. Я попытался использовать setTimeout, setInterval, then(), преобразовывая цикл в рекурсию. Каждый раз, когда либо оценивает(), он выполняет свою работу, но не уходит (просто висит) или уходит, прежде чем завершить работу, из-за состояния гонки с помощью end().

Есть ли какой-нибудь опытный пользователь nightmarejs?

function youtube_button_clicker(group) { 
    var nightmare = Nightmare({ 
     show: true 
    }); 

    nightmare 
     .goto(url) 
     .inject('js', 'jquery-3.1.0.js') 
     .then(
      () => nightmare. 
     evaluate(function() { 
    for (i=0;i>LEN;i++) 
    { setTimeout(() => { $(button_element).click() }, i * 2000); } 


    return "done" 


})) 
.catch(function (error) { 

     console.error('Search failed:', error); 
    }); 

} 

Удалить метод .end() и он висит, поставил .END() снова и он пропускает процесс - завершает работу рано. Что я могу сделать ?

+0

Ваш 'setTimeouts' должны быть завернутые в обещания, тогда вам нужно «обещать.все» их, чтобы вы получили событие, когда все закончилось, тогда вам нужно передать обещанное, возвращенное 'all', в' then', чтобы вы могли связать его с другим 'then' или 'end' правильно – slebetman

+0

Не могли бы вы показать мне пример кода? – RetroCode

ответ

1

.evaluate() функции не могут быть асинхронными, по крайней мере, до тех пор, пока не будет включен #819 (или что-то в этом роде). Другими словами, оценка с setTimeout() не сработает. Кроме того, я не думаю, что это был бы очень хороший путь в этом случае, даже если бы это было возможно из коробки.

Как и в сторону, вы могли бы хотят идти дать this пример nightmare-examples для чтения. Он дает краткое руководство по цепочке нескольких операций и циклов.

Возможно, вам удастся избежать рекурсивной функции, но вам нужно быть осторожным, чтобы обеспечить соблюдение условия остановки. (. Вы также можете посмотреть на #625, действие прокрутки, но проблема похожа) От бедра, я думаю, что что-то подобное может заставить вас закрыть:

var iterations = 0; 
var reclick = function(nm) { 
    return nm 
    .click('#some-button') 
    .wait('#element-you-check-for') 
    .then(function() { 
     // you could also use `.visible()` or something before this `.then()` 
     // depends on your use case 
     // here, I'm using the number of iterations 
     if (iterations++ < 10) { 
     return reclick(nm); 
     } 
     return; 
    }); 
} 

nightmare 
    .goto('http://my-domain.tld') 
    .then(function() { 
    return reclick(nightmare); 
    }) 
    .then(function(){ 
    // ... other actions 
    }) 

 Смежные вопросы

  • Нет связанных вопросов^_^