调用program.kill()

时间:2017-01-27 13:49:16

标签: selenium phantomjs webdriver-io

我正在使用phantomjs和webdriverio来获取并呈现由javascript加载的网页,然后将其保存以供稍后由cheerio解析。 这是代码:

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
      })
  })
}

即使我调用program.kill(),我注意到进程列表中的phantomjs,它确实耗尽了相当多的RAM和CPU。

我想知道为什么这个过程不会终止。

2 个答案:

答案 0 :(得分:3)

.close()只关闭窗口。有一个已知的错误,如果它是最后一个窗口,它会保持打开状态。

.quit()应该这样做,但也存在与之相关的问题。

PhantomJS错误报告:https://github.com/detro/ghostdriver/issues/162

有人在该帖子的底部发布了一个不错的解决方法: https://github.com/SeleniumHQ/selenium/issues/767#issuecomment-140367536 这个修复射出一个SIGTERM结束它:(在python中,但可能有用)

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

我喜欢用我的自动化打开一个Docker容器,并在那里运行它。 Docker为我关闭它,但是这超出了你想做的范围。我会推荐上面的SIGTERM + quit方法。

答案 1 :(得分:1)

PhantomJS是一款双组分产品。有一个Javascript在客户端(无论是Web还是其他脚本)上运行,作为代码的一部分。然后是作为服务器端应用程序运行的部分(命令行调用)

我对PhantomJS的经验是,当遇到错误时,PHantomJS服务器端“挂起”但没有响应。如果您可以更新对此脚本的调用以提供输出日志记录,则可以查看PhantomJS应用程序遇到的错误。

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

希望这有助于!如果您希望我澄清任何内容,或者详细说明我很乐意更新我的答案,请在评论中告诉我,谢谢!