2016-10-04 4 views
1

J'essaie de faire un peu de grattage avec nightmare et mon travail est presque fonctionnel. Le problème est que je suis confronté à un problème lorsque j'essaie d'effectuer un click() après le evaluate() et run() ont été appelés. Après avoir exécuté ces deux fonctions, j'essaie d'effectuer un autre clic pour me déplacer vers une autre partie du site Web, mais je n'exécute pas le click().Cliquez sur la fonction n'exécutant pas l'exécution Nightmare.js

À ce stade, je suis sûr que ce qui est noter la question, j'ai quelques hypothèses, peut-être ces fonctions sont asynchrones et je suis en train de click() quand les callbacks ne coûtent pas encore prêt ou l'une de ces fonctions se termine de l'objet courant et nightmare Je n'ai plus la portée.

var Nightmare = require('nightmare'); 
//var nightmare = Nightmare({show:true}) 
var express = require('express'); 
var fs = require('fs'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var app  = express(); 

var urlWeb = "someurl"; 
var selectCity = "#ddl_city"; 
var selectTheater = "#ddl_theater"; 
var enterBtn = "#btn_enter"; 
var mainSelector = "#aspnetForm"; 
var flagReady = true; 

new Nightmare({show:true}) 
.goto(urlWeb) 
.wait(selectCity) 
.select(selectCity, '19') 
.wait(8000) 
.select(selectTheater, '12') 
.wait(1000) 
.click(enterBtn) 
.wait(mainSelector) 
.evaluate(function(){ 

     //returning HTML for cheerio 
     return document.body.innerHTML; 
}) 
.run(function(err, nightmare){ 
    if (err) return console.log(err); 

    // Loading HTML body on jquery cheerio 
    var $ = cheerio.load(nightmare); 

    //Looping on each div for seccion de Carterla para Hoy 
    $('.showtimeDaily').each(function(index, element){ 
     //spanish title 
     console.log($(this).find('h3').children().text()); 
     //english title 
     console.log($(this).find('h4').text()); 
     //schedule for today 
     console.log($(this).find('li').children().text() + " "); 
     //img for movie 
     console.log($(this).find('img').attr('src')); 
      //show time data such as gender, lenght, language 
     console.log($(this).find('.showtimeData').text()); 
     var showtimeData = $(this).find('.showtimeData').text(); 
     //console.log(JSON.stringify(showtimeData.replace(/\t|\n/g, ""))); 
    }) 

     console.log('Done!'); 


}) 
//*****here is wen I try to click***** 
.click('a[href="../showtimes/weekly.aspx"]'); 

Répondre

1

j'avais problème avec le dos d'appels asynchrones, donc ce que je fait est que j'imbrications de l'objet cauchemar pour vous assurer que les tâches en cours d'exécution ont été l'un après l'autre. Ceci est le code:

nightmare 
.goto(urlWeb) 
.wait(selectCity) 
.select(selectCity, '19') 
.wait(8000) 
.select(selectTheater, '12') 
.wait(1000) 
.click(enterBtn) 
.wait(mainSelector) 
.evaluate(function(){ 

     //returning HTML for cheerio 
     return document.body.innerHTML; 
}) 
.then(function(body){ 
    // Loading HTML body on jquery cheerio 
    var $ = cheerio.load(body); 

    //Looping on each div for seccion de Carterla para Hoy 
    $('.showtimeDaily').each(function(index, element){ 
     //spanish title 
     console.log($(this).find('h3').children().text()); 
     //english title 
     console.log($(this).find('h4').text()); 
     //schedule for today 
     console.log($(this).find('li').children().text() + " "); 
     //img for movie 
     console.log($(this).find('img').attr('src')); 
      //show time data such as gender, lenght, language 
     console.log($(this).find('.showtimeData').text()); 
     var showtimeData = $(this).find('.showtimeData').text(); 
     //console.log(JSON.stringify(showtimeData.replace(/\t|\n/g, ""))); 
    }) 
    //**Here I call nightmare to run after the first call back is done***** 
    nightmare 
     .goto('') 
     .wait('body') 
     .title() 
     .then(function(title){ 
      console.log(title); 
     }); 

     console.log('Done!'); 


});