2013-03-22 18 views
5

Sto utilizzando zombie.js per caricare una pagina da un server Express locale durante un test. Sfortunatamente, esiste un elemento di script che chiama Google Analytics. Vorrei bloccare questo script esterno (con garbo) senza impedire che altri script (locali) vengano caricati, se possibile.Impedisci a zombie.js di caricare solo risorse esterne

So che { runScripts : false } è disponibile con chiamate a browser.visit(). Tuttavia, questo si rifiuta di caricare tutti gli script nella pagina, non solo quelli che vivono su altri host. È possibile?

risposta

7

È necessario utilizzare l'oggetto resources.

È possibile impostare determinate richieste per fornire risposte specifiche se non si desidera che la richiesta venga effettivamente eseguita. Faresti quanto segue per rendere Google Analytics restituiscono un documento vuoto:

browser.resources.mock('http://google.com/url/to/analytics.js',{}); 

Si noti che è necessario fornire l'URL esatto che si desidera prendere in giro, non c'è modo per deridere un URL parziale come ad esempio un dominio nome.

+0

Mi sembra che il metodo 'resources.mock' non sia più presente in zombie 4.x. Vedi https://github.com/assaf/zombie/blob/master/src/resources.js – Corkscreewe

8

Dal zombie 3.1, il metodo browser.resources.mock non funziona. L'alternativa è quella di utilizzare nock libreria:

var nock = require('nock') 

nock('http://www.google-analytics.com') 
    .get('/analytics.js') 
    .times(Math.Infinity) 
    .reply(200, '{}') 

var Browser = require('zombie') 
var browser = new Browser() 
0

Forse qualcosa di simile potrebbe funzionare per voi? Attraversa tutte le risorse e "abortisce" quelle che dovrebbero essere ignorate.

const Fetch = require('zombie/lib/fetch'); 

const ignoredResources = [ 
    'google-analytics.com' 
]; 

browser.pipeline.addHandler((browser, request) => { 
    let doAbort = false; 

    ignoredResources.forEach(domain => { 
    if (request.url.includes(domain)) { 
     doAbort = true; 
    } 
    }); 

    if (doAbort) { 
    return new Fetch.Response('', { status: 200 }); 
    } 
}); 
Problemi correlati