2013-03-22 16 views
5

Używam zombie.js do ładowania strony z lokalnego serwera ekspresowego podczas testu. Niestety istnieje element skryptu, który wywołuje Google Analytics. Chciałbym zablokować ten zewnętrzny skrypt (z wdziękiem) bez blokowania innych (lokalnych) skryptów, jeśli to możliwe.Zapobiegaj ładowaniu zombie.js tylko zasobów zewnętrznych.

Wiem, że { runScripts : false } jest dostępny z połączeniami do browser.visit(). Jednak to odmawia załadowania wszystkich i wszystkich skryptów na stronie, a nie tylko tych, którzy żyją na innych hostach. czy to możliwe?

Odpowiedz

7

Powinieneś użyć obiektu resources.

Możesz ustawić niektóre żądania, aby udzielić konkretnych odpowiedzi, jeśli nie chcesz, aby żądanie faktycznie przechodziło. Można by wykonać następujące czynności, aby Google Analytics zwróci pusty dokument:

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

Zauważ, że musisz podać dokładny adres URL, który chcesz szydzić, nie ma sposobu, aby drwić częściowy URL, takich jak domeny Nazwa.

+0

Wydaje mi się, że metoda "resources.mock" nie jest już obecna w Zombie 4.x. Zobacz https://github.com/assaf/zombie/blob/master/src/resources.js – Corkscreewe

8

Od zombie 3.1, metoda browser.resources.mock zniknęła. Alternatywą jest użycie nock Biblioteka:

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

Może coś jak to będzie pracować dla Ciebie? Pętla przechodzi przez wszystkie zasoby i "przerywa" te, które powinny zostać zignorowane.

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 }); 
    } 
});