2012-08-05 38 views
5

Tengo un problema con el framework de pruebas de zombie.js y la API de Google Maps.zombie.js y Google Maps API

Tengo un simple zombie.js que carga una página de inicio e intenta hacer clic en un enlace Iniciar sesión. Sin embargo, cuando miro lo que vuelve a la página de inicio HTML (desde la perspectiva del objeto zombie.js navegador), sólo veo esto en la sección del cuerpo:

<body> 
    <script src="https://maps.gstatic.com/intl/en_us/mapfiles/api-3/9/12/main.js"  type="text/javascript"></script> 
</body> 

Si quito el código JavaScript de Google Maps desde la página original, todo funciona bien y obtengo la sección completa. Solicitar una página diferente que no use mapas API también funciona bien.

Veo una pregunta relacionada aquí, pero la solución no se describe en detalle: https://github.com/assaf/zombie/issues/250

¿Puede alguien ayudarme con la solución completa a este?

Este es el código zombie.js en cuestión:

suite('Zombie Sign In', function() { 

    test('Home page should have sign-in link', function(done) { 
     var browser = new Browser(); 
     browser.debug = true; 
     browser.authenticate().basic(conf.basicAuth.username, conf.basicAuth.password); 
     browser.visit(conf.baseURL, function(e, browser) { 
      console.log(browser.html()); // here is where I get the empty body section 
      browser.clickLink("Sign In", function() { 
       browser.text("title").should.eql('my title'); 
       done();    
      }); 
     }); 
    }); 
}); 

Respuesta

3

me encontré con este problema hoy - sólo tiene que cargar el API de forma asíncrona. Esto no es tanto una solución como una alternativa documentada, que se puede leer aquí:

https://developers.google.com/maps/documentation/javascript/tutorial#asynch

Esencialmente sólo tiene que cambiar ningún código como este:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE" type="text/javascript"></script> 
<script type="text/javascript"> 
    function initialize() { 
    var map = new google.maps.Map(/* ... */); 
    } 

    window.onload = initialize(); 
</script> 

Para este (levantado casi en su totalidad desde el siguiente enlace):

<script type="text/javascript"> 
    function initialize() { 
    var map = new google.maps.Map(/* ... */); 
    } 

    function loadScript() { 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.src = "http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=TRUE_OR_FALSE&callback=initialize"; 
    document.body.appendChild(script); 
    } 

    window.onload = loadScript; 
</script> 

la clave a destacar aquí es que usted tiene que pasar una devolución de llamada parámetro a la etiqueta script.src (en este ejemplo proporcionamos initialize, pero puede ser lo que quiera) - esto permitirá que google active su código de inicialización cuando la etiqueta del script de maps inyectado dinámicamente haya terminado de cargarse.

Este segundo mecanismo solucionó mis pruebas de Zombie.