你如何使用Minitest,Capybara,Selenium进行javascript测试?

时间:2011-04-13 20:24:26

标签: ruby-on-rails ruby-on-rails-3 selenium capybara minitest

有很多关于如何使用Capybara / Selenium / Rspec 执行javascript测试的示例,您可以在其中编写测试:

it "does something", :js => true do
  ...
end

然而,使用 minitest ,您无法传递第二个参数来指示selenium执行测试。

有没有人对如何做到这一点有任何想法?

4 个答案:

答案 0 :(得分:18)

:js标志正在做什么非常简单。它将当前驱动程序从默认(机架测试)切换到另一个支持javascript执行的驱动程序(selenium,webkit)。你可以用minitest做同样的事情:

require "minitest/autorun"

class WebsiteTest < MiniTest::Unit::TestCase
  def teardown
    super
    Capybara.use_default_driver
  end

  def test_with_javascript
    Capybara.current_driver = :selenium
    visit "/"
    click_link "Hide"
    assert has_no_link?("Hide")
  end

  def test_without_javascript
    visit "/"
    click_link "Hide"
    assert has_link?("Hide")
  end
end

当然,为方便起见,您可以将其抽象为模块:

require "minitest/autorun"

module PossibleJSDriver
  def require_js
    Capybara.current_driver = :selenium
  end

  def teardown
    super
    Capybara.use_default_driver
  end
end

class MiniTest::Unit::TestCase
  include PossibleJSDriver
end

class WebsiteTest < MiniTest::Unit::TestCase
  def test_with_javascript
    require_js
    visit "/"
    click_link "Hide"
    assert has_no_link?("Hide")
  end

  def test_without_javascript
    visit "/"
    click_link "Hide"
    assert has_link?("Hide")
  end
end

答案 1 :(得分:0)

嗯,我注意到文档中有几行似乎只能说上面的内容只能在Rspec中完成

但是,如果您使用的是 RSpec或黄瓜,则可能需要考虑将:rack_test更快地保留为default_driver,并仅标记那些需要支持JavaScript的驱动程序using :js => true@javascript

答案 2 :(得分:0)

https://github.com/wojtekmach/minitest-metadata似乎已经为此提供了解决方案。

您可以执行以下操作:

describe "something under test" do
  it "does not use selenium for this test" do
    visit "/"
    assert body.has_content?("Hello world")
  end

  it "does use selenium for this test", :js => true do
    visit "/"
    click_link "Hide" # a link that uses a javascript click event, for example
    assert body.has_no_link?("Hide")
  end
end

答案 3 :(得分:0)

为了更新一些信息,现在有一个功能更强大的selenium-webdriver Ruby Bindings

要使用Rails 4和selenium-webdriver快速测试终端上的Firefox,您需要执行以下4个步骤:

  1. 将gem添加到您的Gemfile

    gem&#39; selenium-webdriver&#39; gem&#39; minitest-rails&#39;

  2. 安装宝石

    捆绑安装

  3. 生成测试用例(参考:Official Guide

    bin / rails生成integration_test your_case_name

  4. 开始在测试用例中编写测试代码。 实际上你可以在没有Capybara的红宝石中写它,用Capybara写一个案例你可以参考Capybara at Github

  5. 最小样本:

    # create a driver
    driver = Selenium::WebDriver.for :firefox
    # navigate to a page
    driver.navigate.to 'url_to_page'
    # get element with class box
    box = driver.find_element(:css, '.box')
    
    # check width
    # get width by execute JavaScript
    assert_equal 100, driver.execute_script('return $(arguments[0]).width()', box)
    

    目前似乎缺乏关于如何顺利使用selenium-webdriver,CI服务器(Jenkins)和Rails minitest的资源,我创建了一个简单的项目,并希望它可以帮助任何人快速轻松地开始: Rails Selenium Working Case

    同样感谢让我能够做出更好回答的评论。