Rails Phantomjs, полтергейст и капибара плохо работают вместе

Работая в проекте rails 3.1.2 (mac OS X), у меня правильно установлен PhantomJS (я могу запустить код, подобный следующему, и он работает идеально, точно захватывая заголовок страницы и сохраняя точный снимок экрана)

try_phantom.coffee

page = require('webpage').create()
page.open 'http://localhost:5000/parties/onetestparty', (status) ->
    title = page.evaluate -> document.title
    console.log "Title: #{title}"
    page.render './log/javascript_screenshot.png'
    phantom.exit()

Однако, когда я пытаюсь использовать капибару/полтергейст в rspec следующим образом:

spec_helper.rb

require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

а затем используя спецификацию с вызовом, требующим javascript:

party_spec.rb

        it "should allow a simple screenshot", js: true do
            visit "/"
            page.driver.render('./log/screen_Home.png', :full => true)
        end

Не похоже, что мой javascript обрабатывается, а также скриншот всегда пуст!

Я пробовал отладчик, но он, похоже, также вызывает пустую HTML-страницу (просто html с пустыми тегами заголовка и тела)

Я почти уверен, что проблема либо в интерфейсе между водосвинкой и полтергейстом, либо (что более вероятно) в полтергейсте и фантомах. Вот версии соответствующих драгоценных камней:

capybara 1.1.3
capybara-webkit 0.13.0
полтергейст 1.0.2
phantomjs 1.7.0

Не уверен, как устранить неполадки дальше... Будем признательны за любую помощь.


person Dave Collins    schedule 26.11.2012    source источник
comment
Примечание. Я также пытался явно указать полтергейсту, где можно найти мои фантомы: :phantomjs =› /usr/local/Cellar/phantomjs/1.7.0/bin/phantomjs. Это не меняет результат ... Однако я думаю, что это доказывает, что phantomjs действительно запускается, потому что, если я укажу ему фиктивный путь, я получу ошибку.   -  person Dave Collins    schedule 27.11.2012


Ответы (3)


Создайте очень простой тест и посмотрите, что произойдет.

simple_spec.rb

require 'spec_helper'
require 'capybara/poltergeist'
include Capybara::DSL
Capybara.javascript_driver = :poltergeist

describe 'some stuff which requires js', :js => true do
  it 'will take a screenshot' do
    visit("http://google.com")
    page.driver.render('./file.png', :full => true)
  end
end

Получается ли у вас образ Google?

person theSociableme    schedule 27.11.2012
comment
Да, это так... На самом деле, я обнаружил, что если я оставлю сервер rails работающим и изменю приведенный выше код, чтобы посетить localhost :5000, то он действительно верно отображает эту страницу. Однако, когда я добавляю Capybara::DSL в другие мои тестовые спецификации, они падают в разных местах... Сейчас устраняем неполадки. Спасибо!! - person Dave Collins; 27.11.2012
comment
Я собираюсь отметить этот ответ как правильный, потому что он помог мне решить проблему невозможности сделать снимок экрана из rspec. У меня все еще есть устранение неполадок Capybara::DSL, но это отдельная проблема. Спасибо! - person Dave Collins; 28.11.2012

У меня была такая же проблема, но в моем случае она была вызвана использованием поддоменов. Полтергейст был указан на бессмысленный URL-адрес (вроде «http://spb.:22789»), поэтому он не получает ничего, кроме «about:blank».

Чтобы решить эту проблему, я сделал следующее:

  1. Установите app_host и server_port для Capybara

    Capybara.app_host = 'http://city.tulp.test:3003'
    Capybara.server_port = 3003

  2. Добавьте фиктивный домен в /etc/hosts

Надеюсь это поможет.

person Eugene    schedule 05.12.2012
comment
Я попробую это и дам вам знать! Спасибо! - person Dave Collins; 06.12.2012
comment
Хм. Тот же результат ... @Eugene Я предполагаю, что вы установили свой .app_host на свою ЛОКАЛЬНУЮ машину? Где работает набор тестов? - person Dave Collins; 06.12.2012
comment
О.. Я только что заметил ваш вопрос, извините. Если это все еще актуально - да, тесты выполняются на локальной машине, но вы можете использовать lvh.me (который всегда указывает на 127.0.0.1) как на более распространенное решение. - person Eugene; 11.01.2013

Может поможет если прописать драйвер?

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {debug: false})
end
Capybara.current_driver = :poltergeist # NOTE THE CURRENT_DRIVER, NOT JAVASCRIPT_DRIVER!
person BvuRVKyUVlViVIc7    schedule 26.11.2012
comment
Отличное предложение, но я пробовал это (с отладкой как false, так и true), и никакой разницы в проблеме. Постоянно пустой снимок экрана. - person Dave Collins; 27.11.2012
comment
попробуй добавить sleep 5 а потом сделай скрин.. может нужно какое то время для отображения - person BvuRVKyUVlViVIc7; 27.11.2012
comment
Еще одно отличное предложение, но сколько бы я ни спал, оно все равно остается пустым. - person Dave Collins; 27.11.2012
comment
Интересное замечание: когда я добавляю эту строку .current_driver, весь процесс занимает больше времени... Но результат тот же. - person Dave Collins; 27.11.2012
comment
Примечание: есть два r для current_driver - person Dorian; 16.09.2013
comment
Ха-ха, так смешно, через год я снова попытался решить ту же проблему... и нашел свой собственный ответ ^^ - person BvuRVKyUVlViVIc7; 05.12.2013
comment
@Lichtamberg Я тоже сейчас сталкиваюсь с той же проблемой. Можете ли вы сказать мне свое решение? Спасибо перед рукой. :) - person Phanith; 21.03.2016
comment
Просто пришлось прописать драйвер через Capybara.current_driver... Думаю как минимум.. Уже некоторое время назад :) - person BvuRVKyUVlViVIc7; 21.03.2016