2017-01-27 4 views
1

私はphantomjsとwebdriverioを使ってjavascriptによって読み込まれたWebページを取得してレンダリングし、後でCheerioによって解析されます。私は私が気づくprogram.kill()を呼び出していてもphantomJSプロセスは、program.kill()を呼び出した後、バックグラウンドで動作し続けます。

import phantomjs from 'phantomjs-prebuilt' 
const webdriverio = require('webdriverio') 

const wdOpts = { 
    desiredCapabilities: { 
    browserName: 'phantomjs' 
    } 
} 

async parse (parseUrl) { 
    return phantomjs.run('--webdriver=4444').then(program => { 
    return webdriverio.remote(wdOpts) 
     .init() 
     .url(parseUrl) 
     .waitForExist('.main-ios', 100000) 
     .pause(5000) 
     .getHTML('html', true) 
     .then((html) => { 
     program.kill() 
     return html 
     }) 
    }) 
} 

そのプロセスのリストでphantomjs、それはRAMとCPUのかなりを使用しない: は、ここにそのためのコードです。

なぜプロセスが終了しないのだろうか。

答えて

3

.close()はウィンドウを閉じるだけです。開いている最後のウィンドウであれば、既知のバグがあります。

.quit()はそれを行う必要がありますが、それに関連する問題もあります。

(Pythonでは、しかし、便利かもしれません):この修正プログラムは、それを終了するSIGTERMを撮影 https://github.com/SeleniumHQ/selenium/issues/767#issuecomment-140367536https://github.com/detro/ghostdriver/issues/162

誰かそのスレッドの最下部に掲載まともな回避策があります:バグ報告が

PhantomJS

# assume browser = webdriver.PhantomJS() 
browser.service.process.send_signal(signal.SIGTERM) 
browser.quit() 

私のオートメーションでDockerコンテナを開いてそこで実行するのが好きです。 Dockerは私のためにそれをクローズしていますが、これはあなたがやりたいことのための範囲外です。私は上記のSIGTERM + quitメソッドをお勧めします。

1

PhantomJSは2成分製品です。あなたのコードの一部としてクライアント側(ウェブか他のスクリプトか)で動作するJavascriptがあります。次に、サーバーサイドアプリケーション(コマンドラインコール)として実行される部分があります。

エラーが発生した場合、PHANTOMJSサーバー側は「ハング」しますが応答しません。このスクリプトへの呼び出しを更新して出力ログを提供できる場合は、PhantomJSアプリケーションが遭遇しているエラーを確認することができます。

phantomjs /path/to/script/ > /path/to/log/file 2>&1 

希望の方はこちら!私が何かを明確にしたい、または精巧にしたい場合は、私の答えを更新して嬉しいです。私はコメントでお知らせください、ありがとう!

+0

答えてくれてありがとう、私はこれを実装する方法がわからない。私はノードアプリケーションを実行しているので、単純に 'npm install'を行い、スクリプト内から' phantomjs'を要求します。 私はスタンドアロンサーバーを使用していないので、これが可能かどうかはわかりません –

関連する問題