2016-07-13 14 views
3

Hallo Leute, ich bin wirklich neu in der Webentwicklung, vor kurzem habe ich begonnen NodeJS zu lernen und ich habe einen einfachen Youtube Scraper geschrieben, der NightmareJS verwendet und die Anzahl der Likes, Views, Autors und Titelnamen pro Video-URLTesten von NightmareJS Code mit Mocha schlägt fehl

Jetzt versuche ich meinen Code mit Mocha zu testen (um einige Unit-Tests zu üben) und aus irgendeinem Grund schlägt er mit dem folgenden Fehler fehl: "Fehler: Timeout von 2000ms überschritten. Stellen Sie sicher, dass der Rückruf done() ist in diesem Test aufgerufen werden. "

Ich habe versucht, die Auszeit zu erhöhen (bis zu 15 Sekunden), aber es hat nicht geholfen, ich denke, es hängt irgendwo. Was vermisse ich? Ich freue mich auch über konstruktive Kritik an der Code-Struktur und Implementierung.

Hier ist mein Code:

var Nightmare = require('nightmare'); 
var expect = require('chai').expect; 
var assert = require('chai').assert; 
youtube_url = 'https://www.youtube.com/watch?v=0_oPsFTyhjY'; 

describe('test youtube video url results', function() { 
    it('should return the actual video url/title/author name/num of likes and views', function(done) { 
     var nightmare = Nightmare({ show: false, gotoTimeout: 3000 }) 
     nightmare 
      .goto(youtube_url) 
      .scrollTo(10000,0) 
      .wait('#comment-section-renderer-items') 
      .evaluate(function (youtube_url) { 
       var authorSelector = '#watch7-user-header > div > a'; 
       var titleSelector = '#eow-title'; 
       var vcountSelector = '#watch7-views-info > div.watch-view-count'; 
       var lcountSelector = '#watch8-sentiment-actions > span > span:nth-child(1) > button > span'; 

       var authorElement = document.querySelector(authorSelector); 
       var titleElement = document.querySelector(titleSelector); 
       var vcountElement = document.querySelector(vcountSelector); 
       var lcountElement = document.querySelector(lcountSelector); 

       var JSONres = {'VIDEO URL':url, 'VIDEO TITLE': titleElement.innerText,'AUTHOR NAME': authorElement.innerText, 
       'NUMBER OF VIEWS': vcountElement.innerText, 'NUMBER OF LIKES': lcountElement.innerText}; 

       return (JSONres) 
      },youtube_url) 
      .end() 
      .then(function (result) { 
       try{ 
        expect(result['VIDEO URL']).to.equal(youtube_url); 
        expect(result['VIDEO TITLE']).to.equal('The Best Mouse in the World?'); 
        expect(result['AUTHOR NAME']).to.equal('Unbox Therapy'); 
        assert.isAtLeast(result['NUMBER OF VIEWS'], 1816808, 'The number of views is at least the number of views that has been already seen'); 
        // It's possible to remove your like from the video so hypothetically many users may remove their likes thus there is no upper/lower 
        // bound on the like amount a video can have at any time except that it must be non-negative. 
        assert.isAtLeast(result['NUMBER OF LIKES'], 0, 'The number of likes is at least a non-negative number'); 
        done(); 
       } 
       catch(error){ 
        done(error); 
       } 
      }) 

    }); 
}); 

Antwort

1

unerwartet das Timeout auf 20 Sekunden [mit this.timeout(20000);] nur das Problem gelöst (aus irgendeinem Grund), obwohl der Test tatsächlich nahm nie mehr als 6 Sekunden erhöht .

-1

möchten Sie vielleicht this.timeout (0) verwenden; um das Zeitlimit zu deaktivieren