2011-11-14 45 views
3

我有以下cakefile任務來運行硒測試,它運行成功,到達測試結束但不會退出。咖啡腳本cakefile任務沒有完成

muffin = require 'muffin' 
wrench = require 'wrench' 
http = require 'http' 
fs  = require 'fs' 
spawn = require('child_process').spawn 
exec = require('child_process').exec 

task 'selenium', 'run selenium tests', (options) -> 
    sel = require './test/selenium' 
    app = spawn 'node', ['app.js'] 
    app.stdout.on 'data', (data) -> 
     if /listening on port/.test data 
      selenium = spawn 'selenium' 
      selenium.stdout.on 'data', (data) -> 
       console.log 'stdout: ' + data 
       if /Started.*jetty.Server/.test data 
        sel.run -> 
         app.stdin.end() 
         selenium.stdin.end() 
         console.log 'completed Selenium Tests' 

有沒有辦法讓我完成任務?我得到控制檯中記錄的「已完成的Selenium測試」。

+0

如果你採用相同的代碼(沒有'task'selenium''位),並在'.coffee'而不是'Cakefile'中運行,你會得到相同的行爲,對吧? –

+0

我已經將所有這些代碼轉換爲香草javascript和外部的自動運行的cakefile,並且獲得相同的結果 –

回答

0

特雷弗·伯納姆,指出我在正確的方向。但潛在的問題是,我產生的硒子進程是一個運行java進程的shell腳本。所以基本上當調用app.kill()時,它會殺死shell腳本而不是基礎java進程。

感謝您的幫助。

2

如果兩個子進程之一(appselenium)仍在運行,則主進程將繼續運行。在他們上調用stdin.end()不會改變這一點。你想要做的是迫使他們死了,用恰當地命名爲kill method

app.kill() 
selenium.kill() 
console.log 'completed Selenium Tests' 
+0

謝謝,我試過這個,甚至使用.end()方法與kill()方法並行運行 –

+0

該Node文檔說:「請注意,雖然函數被稱爲'kill',傳遞給子進程的信號可能不會真正殺死它。」嘗試添加'app.on'exit', - > console.log'app exited''(同樣對於'selenium'),找出哪個進程沒有退出。 –

+0

謝謝,我發現硒子過程正在被殺死。我的錯誤是,我沒有意識到它正在殺死打開硒的shell腳本而不是java進程本身!謝謝,你幫我找到了解決方案。 –

0

另一種選擇是致電process.exit()。雖然,我不確定對孩子有什麼影響。