2012-08-01 43 views
5

iframeを使ってウェブサイトをテストできるNode.jsを使ってキュウリテストをセットアップしようとしています。 通常、iframeはクロススクリプトのセキュリティ上の制限のために動作しません。 しかし、可能だった場合(私はそれが確信しています。そして、私はあなたに解決策を提示することを信頼します) 特定のURL名が要求されているときに、要求されたURLを介してテストの対象となるWebサイトを取得します。 iframeにテストターゲットのコピーがロードされます。 基本的には、req.url に基づいて特定のページをフェッチする標準のnode.jsサーバーです。アドレス要求ルーターに似ています。Node.js経由でHTTPリクエストをルーティングする

これは私がまったくそれをするためのぼんやりした試みです。 経由でテストページを取得しています。 URLは機能します。 しかし、httpサーバから接続オブジェクトへの切り替えに問題があります。 httpサーバの応答で接続を「フィード」する方法はありますか?

PS。私は2つのnode.jsサーバーを持つソリューションも作成しました。 ノード1は、テストターゲットをフェッチし、キュウリテストページと混合します。 キュウリ試験を実施しているノード2。 このソリューションは機能しています。しかし、それはJavaScriptの名前の競合が発生するWebサイト上で問題を作成します。だから、カプセル化によってこの問題を解決するiframeソリューションは、より魅力的です。

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

答えて

3

結局、それほど難しくありませんでした。
node.jsを初めて使用しているので、複数のリスナーを使用する可能性を認識しなければなりませんでした。
nodejitsuの機能を読めば、私はこの問題を解決するのに役立ちました。ウェブサイトの要求をcucumber.jsとして他のすべての要求が処理されるhttp://localhost:9788/myWebsiteToBeTestedWithCucumberJS を次のようにURLを指定する場合は以下の実施例

はwww.myWebsiteToBeTestedWithCucumberJS.com ロードします。
これは、他の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

Cukestall(https://github.com/jbpros/cukestall)をご覧になることをお勧めします。 Cucumber.jsの潜在的な正式な "iframeランナー"です。 * local * Node.jsアプリケーションのテストを目的としています。ただし、* remote *アプリでフィーチャスイートを実行して読み込むのはかなり簡単です。 – jbpros

+0

は 'loadMyWebsiteToBeTestedWithCucumberJS'関数名のアップコートを持っています –

関連する問題