2012-08-01 29 views
5

Estoy tratando de hacer una configuración de prueba de pepino con Node.js que pueda probar cualquier sitio web utilizando un iframe. Normalmente, el iframe es un no ir debido a las limitaciones de seguridad del script cruzado. Sin embargo, si fue posible (estoy seguro de que lo es) y confío en que usted obtenga una solución) para obtener el sitio web objetivo para la prueba a través de la url solicitada cuando se solicita un nombre de url específico, para que el iframe se cargará con una copia del objetivo de prueba. Básicamente solo un servidor node.js estándar que busca páginas específicas basadas en el req.url similar a un enrutador de solicitud de direcciones.Enrutamiento de solicitudes http a través de Node.js

Aquí está mi evidente intento de hacer exactamente eso. Obteniendo la página de prueba a través de. la url funciona Pero estoy teniendo un problema al cambiar del servidor http al objeto de conexión. ¿Hay alguna manera de "alimentar" la conexión con la respuesta del servidor http?

PS. También creé una solución con dos servidores node.js. El nodo 1 obtuvo el objetivo de prueba y lo mezcló con la página de prueba de pepino. Nodo 2 que aloja la prueba de pepino. Esta solución está funcionando. Pero crea problemas en los sitios web donde se producen conflictos de nombres de JavaScript. Por eso, la solución iframe que resuelve este problema mediante encapsulación es más atractiva.

var http = require('http'); 
var connect = require('connect'); 
var port = process.env.PORT || 8788; 

var server = http.createServer(function(req, webres) 
{ 
    var url = req.url; 
    console.log(url); 

    if(url == '/myWebsiteToBeTestedWithCucumberJS') 
    { 
     // Load the web site to be tested "myWebsiteToBeTestedWithCucumberJS" 
      // And update the references 
      // Finaly write the page with the webres 
      // The page will appear to be hosted locally 

     console.log('Loading myWebsiteToBeTestedWithCucumberJS'); 
     webres.writeHead(200, {'content-type': 'text/html, level=1'}); 
     var options = 
     { 
        host: 'www.myWebsiteToBeTestedWithCucumberJS.com, 
        port: 80, 
        path: '/' 
     }; 

     var page = ''; 
     var req = http.get(options, function(res) 
     { 
      console.log("Got response: " + res.statusCode); 
      res.on('data', function(chunk) 
      { 
       page = page + chunk; 
      }); 
      res.on('end', function() 
      { 
        // Change relative paths to absolute (actual web location where images, javascript and stylesheets is placed) 
        page = page.replace(/ href="\/\//g  , ' href="/'); 
        page = page.replace(/ src="\//g   , ' src="www.myWebsiteToBeTestedWithCucumberJS.com'); 
        page = page.replace(/ data-src="\//g  , ' data-src="www.myWebsiteToBeTestedWithCucumberJS.com'); 
        page = page.replace(/ href="\//g   , ' href="www.myWebsiteToBeTestedWithCucumberJS.com'); 

        webres.write(page); 
        webres.end(''); 
      }); 
     }); 
    } 
    else 
    { 
     // Load any file from localhost:8788 
      // This is where the cucumber.js project files are hosted 
     var dirserver  = connect.createServer(); 
     var browserify = require('browserify'); 
     var cukeBundle = browserify({ 
      mount: '/cucumber.js', 
      require: ['cucumber-html', './lib/cucumber', 'gherkin/lib/gherkin/lexer/en'], 
      ignore: ['./cucumber/cli', 'connect'] 
     }); 
     dirserver.use(connect.static(__dirname)); 
     dirserver.use(cukeBundle); 
     dirserver.listen(port); 
    } 
}).on('error', function(e) 
{ 
     console.log("Got error: " + e.message); 
}); 
server.listen(port); 
console.log('Accepting connections on port ' + port + '...'); 

Respuesta

3

Bueno, no fue tan difícil después de todo.
Como soy nuevo en node.js, tuve que darme cuenta de las posibilidades de utilizar múltiples oyentes.
Leer en las características de nodejitsu me ayudó a resolver el problema.

Debajo ejemplo carga www.myWebsiteToBeTestedWithCucumberJS.com al especificar la dirección URL de la siguiente manera: http://localhost:9788/myWebsiteToBeTestedWithCucumberJS donde todas las demás solicitudes se maneja como cucumber.js solicitudes de sitios web.
Espero que esto tenga sentido para otros node.js newcucumbers.

var http = require('http'); 

var connect = require('connect'); 
var port = process.env.PORT || 9788; 

var server = http.createServer(function(req, webres) 
{ 
    var url = req.url; 
    console.log(url); 
    if(url == '/myWebsiteToBeTestedWithCucumberJS') 
    { 
     loadMyWebsiteToBeTestedWithCucumberJS(req, webres); 
    } 
    else 
    { 
     loadLocal(req, webres, url); 
    } 
}).on('error', function(e) 
{ 
     console.log("Got error: " + e.message); 
}); 
server.listen(port); 
console.log('Accepting connections on port ' + port + '...'); 

function loadMyWebsiteToBeTestedWithCucumberJS(req, webres) 
{ 
    console.log('Loading myWebsiteToBeTestedWithCucumberJS'); 
    webres.writeHead(200, {'content-type': 'text/html, level=1'}); 
    var options = 
    { 
       host: 'www.myWebsiteToBeTestedWithCucumberJS.com', 
       port: 80, 
       path: '/' 
    }; 

    var page = ''; 
    var req = http.get(options, function(res) 
    { 
     console.log("Got response: " + res.statusCode); 
     res.on('data', function(chunk) 
     { 
      page = page + chunk; 
     }); 
     res.on('end', function() 
     { 
       page = page.replace(/ href="\/\//g  , ' href="/'); 
       page = page.replace(/ src="\//g   , ' src="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); 
       page = page.replace(/ data-src="\//g  , ' data-src="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); 
       page = page.replace(/ href="\//g   , ' href="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); 

       webres.write(page); 
       webres.end(''); 
     }); 
    }); 

} 

function loadLocal(req, webres, path) 
{ 
    console.log('Loading localhost'); 
    webres.writeHead(200, {'content-type': 'text/html, level=1'}); 
    var options = 
    { 
       host: 'localhost', 
       port: 9787, 
       path: path 
    }; 

    var page = ''; 
    var req = http.get(options, function(res) 
    { 
     console.log("Got response: " + res.statusCode); 
     res.on('data', function(chunk) 
     { 
      page = page + chunk; 
     }); 
     res.on('end', function() 
     { 
       webres.write(page); 
       webres.end(''); 
     }); 
    }); 
} 


// Cucumber site listening on port 9787 
var dirserver  = connect.createServer(); 
var browserify = require('browserify'); 
var cukeBundle = browserify(
{ 
    mount: '/cucumber.js', 
    require: ['cucumber-html', './lib/cucumber', 'gherkin/lib/gherkin/lexer/en'], 
    ignore: ['./cucumber/cli', 'connect'] 
}); 
dirserver.use(connect.static(__dirname)); 
dirserver.use(cukeBundle); 
dirserver.listen(9787); 
+0

Como nota al margen, puedo recomendarle que eche un vistazo a Cukestall (https://github.com/jbpros/cukestall). Es el potencial "corredor iframe" oficial para Cucumber.js. Está dirigido a probar una aplicación * local * Node.js. Sin embargo, debería ser bastante fácil ejecutar y cargar el conjunto de funciones en una aplicación * remota *. – jbpros

+0

tienen un voto alternativo para el nombre de función 'loadMyWebsiteToBeTestedWithCucumberJS' –

Cuestiones relacionadas