webkit_server периодически зависает при запуске из Capybara в Ruby

У меня возникла проблема, когда экземпляр webkit_server с Capybara и capybara-webkit, работающий без головы, подключенный к локальному экрану Xvfb, зависает при посещении URL-адреса. Кажется, это происходит после нескольких минут многократного посещения разных URL-адресов и запуска поисковиков. (Я использую капибару для очистки экрана в ванильном Ruby, а не для тестирования.)

Я подтвердил, что когда он зависает, сайт по-прежнему доступен (например, через curl или wget в командной строке). Я также попытался обернуть код Ruby, который вызывает посещение и последующие средства поиска, в блок Timeout, чтобы после 60 секунд ожидания был посещен новый URL-адрес, но любая попытка посещения () терпит неудачу после первого раза, когда это происходит. Единственный способ решить проблему — убить как процесс Ruby, вызывающий Capybara/capybara-webkit, так и процесс webkit_server, и перезапустить их.

Когда я запускаю процесс webkit_server, я постоянно вижу такой вывод:

clock_gettime(CLOCK_MONOTONIC, {5821, 680279627}) = 0
gettimeofday({1330890176, 712033}, {0, 33052112}) = 0
gettimeofday({1330890176, 712087}, {0, 140736435864256}) = 0
gettimeofday({1330890176, 712137}, {0, 33108640}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680486036}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680530091}) = 0
read(7, 0x1fac1b4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)

И если я трассирую процесс Ruby, который его вызывает, он зависает на read():

Process 3331 attached - interrupt to quit
read(5, 
^C <unfinished ...>
Process 3331 detached

Я знаю, что код Ruby зависает в методе посещения Capybara().

Любые идеи о том, что я могу сделать, чтобы устранить неполадки или исправить это, приветствуются. Я предполагаю, что проблема как-то связана с некоторым ресурсом, который webkit_server должен посетить URL-адрес, но я не уверен, что делать дальше.

Спасибо!


person Chris Hart    schedule 04.03.2012    source источник
comment
Кроме того, я попытался использовать драйвер webkit_debug Capybara и обнаружил собственное ведение журнала Capybara. Последние строки отладочного вывода: ›› Visit ›› 1 ›› 109 ›› http://[URL-адрес сайта] Я пытался использовать xwd для захвата экрана того, что происходит в данный момент: xwd -root -display :1 | xwdtopnm | pnmtopng › screenshot.png Но у меня получается только черный прямоугольник.   -  person Chris Hart    schedule 05.03.2012


Ответы (3)


Capybara-webkit 1.0 также случайным образом зависает на всем наборе для меня.

Просто добавить «тонкий» было недостаточно. Но явное использование тонкого обработчика сработало. Добавлено в env.rb:

Capybara.server do |app, port|
  require 'rack/handler/thin'
  Rack::Handler::Thin.run(app, :Port => port)
end

Примечание Предупреждение о тонком использовании: webkit/issues/399#issuecomment-22328028

person Grimmo    schedule 07.08.2013
comment
Если бы я мог дать вам 1000 голосов, я бы это сделал. После нескольких часов опробования всего, это сделало это. Вы также можете отключить раздражающее тонкое ведение журнала при запуске, добавив: Thin::Logging.silent = true - person yagooar; 29.06.2014

Я обнаружил, что вызов Capybara.reset_sessions! после ошибки решает эту проблему. Я не уверен, почему, но с тех пор у меня не было этой проблемы.

person Chris Hart    schedule 14.04.2012
comment
не могли бы вы уточнить, где вы добавляете reset_sessions? Это в после крюка? Как обусловить его вызов возникновением ошибки? - person Les Nightingill; 03.04.2015

Я видел эту проблему, когда Capybara использует Webrick для запуска сервера. Добавьте «gem 'thin'» в свой Gemfile, и он будет автоматически использовать его вместо этого. Посмотрите, поможет ли это?

person Jonathan del Strother    schedule 06.04.2012
comment
Спасибо. К сожалению, мне приходится использовать webkit_server, так что я не думаю, что в этом конкретном случае тонкий поможет. Хотя это может помочь с другими серверами. - person Chris Hart; 15.04.2012
comment
Возможно, я ошибаюсь, но я думал, что webkit_server — это просто безголовый браузер. Capybara по-прежнему использует Thin/Webrick/что-то еще, чтобы браузеру было о чем поговорить, верно? - person Jonathan del Strother; 16.04.2012
comment
Я обнаружил, что мне пришлось явно добавить тонкий обработчик, как это сделал Гриммо. - person Empact; 22.08.2013