2012-08-01 38 views
5

Próbuję przeprowadzić konfigurację testu ogórka za pomocą Node.js, który może testować dowolną witrynę przy użyciu elementu iframe. Zwykle element iframe nie może przejść z powodu ograniczeń bezpieczeństwa skryptu krzyżowego. Jeśli jednak było to możliwe (jestem pewien, że tak jest, i ufam, że wymyślisz rozwiązanie) , aby pobrać stronę docelową do testu za pomocą żądanego adresu URL, gdy żądana jest określona nazwa adresu URL, aby element iframe zostanie załadowany kopią celu testowego. Zasadniczo tylko standardowy serwer node.js, który pobiera określone strony na podstawie adresu rq.url Akin na adres Router żądania adresu.Routing żądań HTTP za pośrednictwem Node.js

Oto moja rażąca próba zrobienia tego właśnie. Pobieranie strony testowej za pośrednictwem. adres URL działa. Ale mam problem z przełączaniem z serwera http do obiektu połączenia. Czy istnieje sposób na "podanie" połączenia z odpowiedzią serwera http?

PS. Stworzyłem również rozwiązanie z dwoma serwerami node.js. Węzeł 1 przyniósł cel testowy i zmieszanie go ze stroną testową ogórka. Węzeł 2 hostujący test ogórka. To rozwiązanie działa. Ale stwarza problemy na stronach internetowych, na których występują konflikty nazywane javascript. Właśnie dlatego rozwiązanie iframe, które rozwiązuje ten problem przez enkapsulację, jest bardziej atrakcyjne.

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 + '...'); 

Odpowiedz

3

Cóż, wcale nie było tak trudne.
Będąc nowym użytkownikiem node.js musiałem zdać sobie sprawę z możliwości korzystania z wielu słuchaczy.
Czytanie przy pomocy funkcji nodejitsu pomogło mi rozwiązać problem.

Poniżej przykład ładuje www.myWebsiteToBeTestedWithCucumberJS.com podczas określania adresu URL w następujący sposób: http://localhost:9788/myWebsiteToBeTestedWithCucumberJS gdzie wszystkie inne żądania są obsługiwane jako cucumber.js żądania strony internetowej.
Mam nadzieję, że to ma sens dla innych węzłów node.js.

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

Na marginesie, mogę polecić Ci spojrzenie na Cukestall (https://github.com/jbpros/cukestall). Jest potencjalnym oficjalnym "iframe runner" dla Cucumber.js. Ma na celu przetestowanie aplikacji * local * Node.js. Należy jednak dość łatwo uruchomić i załadować pakiet funkcji w * zdalnej * aplikacji. – jbpros

+0

mieć upvote dla nazwy funkcji 'loadMyWebsiteToBeTestedWithCucumberJS' –

Powiązane problemy