使用Cucumber / Capybara测试执行JavaScript

时间:2015-03-30 08:24:35

标签: javascript ruby cucumber capybara

我希望在我的黄瓜测试中在挂钩中执行一些JavaScript,我想要做的是捕获任何JavaScript错误并在我的控制台中输出错误。

我目前遇到的问题是使用execute_script方法运行一段JavaScript

我收到错误

undefined method `execute_script' for #<Cucumber::Ast::Scenario:0x5878608> (NoMethodError)

这是我到目前为止的设置

Capybara.register_driver :firefox do |app|
  profile = Selenium::WebDriver::Firefox::Profile.new
  # see https://github.com/mguillem/JSErrorCollector
  profile.add_extension "./lib/firefox_extensions/JSErrorCollector.xpi"
  profile.native_events = false
  Capybara::Selenium::Driver.new(app, :browser => :firefox)
end

(我是否通过正确指定路径正确添加扩展名?使用.从根开始?)

我的后挂钩

After do |page|
  errors = page.execute_script("return window.JSErrorCollector_errors.pump()")

  if errors.any?
    STDOUT.puts '-------------------------------------------------------------'
    STDOUT.puts "Found #{errors.length} javascript #{pluralize(errors.length, 'error')}"
    STDOUT.puts '-------------------------------------------------------------'
    errors.each do |error|
      puts "    #{error["errorMessage"]} (#{error["sourceName"]}:#{error["lineNumber"]})"
    end
    raise "Javascript #{pluralize(errors.length, 'error')} detected, see above"
  end
end

我在这里做的任何事情看起来都不正确,或者有人以不同的方式做这件事吗?

1 个答案:

答案 0 :(得分:0)

AfterScenario对象(刚刚运行的方案)传递给块,您恰好命名变量page。通常,此变量将被称为scenarioundefined_method行显示错误消息中#<Cucumber::Ast::Scenario:0x5878608>来自哪个对象类型(NoMethodError)。

您应该能够像在After步骤中一样在Cucumber块中执行代码。

After do |scenario|
  errors = page.execute_script("return window.JSErrorCollector_errors.pump()")

  if errors.any?
    STDOUT.puts '-------------------------------------------------------------'
    STDOUT.puts "Found #{errors.length} javascript #{pluralize(errors.length, 'error')}"
    STDOUT.puts '-------------------------------------------------------------'
    errors.each do |error|
      puts "    #{error["errorMessage"]} (#{error["sourceName"]}:#{error["lineNumber"]})"
    end
    raise "Javascript #{pluralize(errors.length, 'error')} detected, see above"
  end
end