Как не пройти этап тестирования функций с помощью Capybara-Webkit, если на странице обнаружена ошибка JavaScript?

Я использую Cucumber, Capybara и Capybara-webkit для тестирования различных сценариев в моем приложении Ruby on Rails.

Есть ли способ обнаружить любую ошибку JavaScript на странице во время выполнения сценариев и не пройти тест? Мы используем эти тесты, чтобы убедиться, что мы не нарушаем функциональность (включая JavaScript) между изменениями в рамках наших автоматических тестовых прогонов.

Я вижу сбои в тестовом выводе, но он не проваливает тест:

http://127.0.0.1:54928/...|16|ReferenceError: Can't find variable: $
http://127.0.0.1:54928/...|16|ReferenceError: Can't find variable: $
...

Спасибо!

Обновление: один из способов, который я нашел, состоит в том, чтобы сделать шаг, который пытается выполнить некоторый JavaScript, который был бы возможен только в том случае, если бы не произошло предыдущих ошибок. В этом случае я бы получил такую ​​ошибку:

Javascript failed to execute (Capybara::Driver::Webkit::WebkitInvalidResponseError)
./features/step_definitions/....rb:19:in `/^I should not see any JavaScript errors$/'
features/....feature:34:in `Then I should not see any JavaScript errors'

Есть ли способ лучше?


person Chris Butler    schedule 09.02.2012    source источник


Ответы (4)


Да, вы можете получить доступ ко всем сообщениям консоли с помощью page.driver.console_messages или только к сообщениям об ошибках с помощью page.driver.error_messages.

Чтобы проверить отсутствие ошибок javascript, я бы предложил что-то из:

Then /^I should see no Java\-Script errors$/ do
  page.driver.error_messages.length.should == 0
end

Примечание: capybara-webkit также включает в себя сопоставитель :have_errors для написания красивого page.should_not have_errors. К сожалению, это кажется неработающим в текущей версии (по крайней мере, для меня; см. также: https://github.com/thoughtbot/capybara-webkit/pull/201)

person jayeff    schedule 23.03.2012

Хотя уведомления об ошибках JavaScript иногда могут быть полезными, вы должны стремиться проверить фактическое поведение JavaScript. Если есть ошибка JavaScript, это должно проявляться как неудачный сценарий.

person Andy Waite    schedule 12.02.2012
comment
Наша проблема заключается в том, что функциональность просмотра чего-то, нарисованного на нашем элементе холста, можно проверить только с помощью неудачных тестов JavaScript. Это связано с тем, что холст (который мы рисуем с помощью моделей Backbone.js) является черным ящиком, когда дело доходит до тестирования (а capybara-webkit еще не позволяет напрямую создавать события кликов). Может быть, есть лучший способ проверить это, что мне не хватает? - person Chris Butler; 14.02.2012

capybara-webkit, похоже, всегда имеет два фиктивных сообщения в нашей среде. Я попытался быть как можно более конкретным и отфильтровать их, но следующее работает, чтобы мы автоматически терпели неудачу при обнаружении ошибки javascript с помощью capybara-webkit:

AfterStep do
  if webkit?
    real_error_messages = []
    page.driver.error_messages.each_with_index do |e, i|
      # first two messages appear to be bogus, always.
      if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1
        # discard message
      else
        real_error_messages << e
      end
    end

    raise "Javascript errors: #{real_error_messages}" if real_error_messages.length > 0
  end
end

Где webkit?:

def webkit?()
  [:webkit, :webkit_debug].include? Capybara.javascript_driver
end

Полная суть здесь

person kross    schedule 21.11.2013
comment
Похоже, это прояснилось, поэтому вам больше не нужно фильтровать сообщения. - person kross; 19.03.2014

Лучший способ запустить на каждом шаге «покажи мне страницу» и проверить свою веб-консоль. Затем вы можете поместить console.log в свой код. где вы выполняете действия для выбранных шагов.

person oivoodoo    schedule 09.02.2012
comment
Спасибо за ответ, но я не думаю, что понимаю... Я ищу способ автоматически сбросить шаги, чтобы мы могли исследовать только в случае сбоя. Необходимость открывать каждую страницу и проверять консоль сводит на нет цель иметь безголовый капибара-вебкит. - person Chris Butler; 09.02.2012