2017-01-27 4 views
1

Я использую phantomjs и webdriverio для извлечения и рендеринга веб-страницы, загружаемой javascript, а затем сохраните ее для последующего анализа cheerio. Вот код для этого:Процесс 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 
     }) 
    }) 
} 

Даже если я называю program.kill() я замечаю, что phantomjs в списке процессов, и это использовать совсем немного оперативной памяти и процессора.

Мне интересно, почему процесс не заканчивается.

ответ

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

PhantomJS является 2-компонентным продуктом. Существует Javascript, который работает на стороне клиента (будь то веб-сайт или другой скрипт) как часть вашего кода. Затем есть часть, которая работает как приложение на стороне сервера (вызов командной строки)

Это был мой опыт работы с PhantomJS, когда при возникновении ошибки сторона сервера PHantomJS «зависает», но не отвечает. Если вы можете обновить свой вызов для этого сценария, чтобы обеспечить ведение журнала вывода, вы можете увидеть, что такое ошибка, с которой сталкивается приложение PhantomJS.

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

Надеюсь, что это поможет! Если вы хотите, чтобы я разъяснил что-либо или разработал, я с удовольствием обновляю свой ответ, просто дайте мне знать в комментарии, спасибо!

+0

Спасибо за ответ, я не уверен, как это реализовать. Я запускаю узловое приложение, поэтому я просто выполнил установку «npm install» и потребовал «phantomjs» из моего сценария. Поскольку я не использую автономный сервер, я не уверен, что это будет возможно –

Смежные вопросы