Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用Minitest、Capybara和Selenium执行javascript测试?_Ruby On Rails_Ruby On Rails 3_Selenium_Capybara_Minitest - Fatal编程技术网

Ruby on rails 如何使用Minitest、Capybara和Selenium执行javascript测试?

Ruby on rails 如何使用Minitest、Capybara和Selenium执行javascript测试?,ruby-on-rails,ruby-on-rails-3,selenium,capybara,minitest,Ruby On Rails,Ruby On Rails 3,Selenium,Capybara,Minitest,关于如何使用Capybara/Selenium/Rspec执行javascript测试,有很多示例,您可以在其中编写如下测试: it "does something", :js => true do ... end 但是,使用minitest时,无法传递第二个参数来指示selenium执行测试 有人对如何做到这一点有什么想法吗?嗯,我注意到文档中有几行似乎说上面的内容只能在Rspec中完成 但是,如果您使用的是 rScript或黄瓜,您可能会考虑将更快的:RACKyTest< /CO

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

it "does something", :js => true do
  ...
end
但是,使用minitest时,无法传递第二个参数来指示selenium执行测试


有人对如何做到这一点有什么想法吗?

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

但是,如果您使用的是<强> rScript或黄瓜,您可能会考虑将更快的<代码>:RACKyTest< /COD>作为<代码> Debug Tuxor < /C> >,并仅使用那些需要JavaScript驱动程序>代码>的测试:使用JS= > Trase或@ JavaScript < /C> >。p> 似乎正好提供了一个解决方案

您可以执行以下操作:

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

: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
要求“小型测试/自动运行”
类WebsiteTest
当然,为了方便起见,您可以将其抽象为一个模块:

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
要求“小型测试/自动运行”
模块可能驱动程序
def需要_js
Capybara.current_驱动程序=:selenium
结束
def拆卸
超级的
使用默认驱动程序
结束
结束
类MiniTest::Unit::TestCase
包括可能的驾驶员
结束
类WebsiteTest
为了更新一些信息,现在有一个更强大的selenium webdriver

要使用Rails 4和selenium webdriver从终端在firefox上快速测试JavaScript,您需要执行以下4个步骤:

  • 将gem添加到您的gem文件中

    gem“selenium webdriver” gem“迷你测试轨道”

  • 安装gem

    捆绑安装

  • 生成测试用例(参考:)

    bin/rails生成集成\u测试您的案例\u名称

  • 开始在测试用例中编写测试代码。 实际上,您可以在不使用Capybara的情况下用ruby编写它,使用Capybara编写case可以参考

  • 小型测试样本:

    # 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 server(Jenkins)和Rails minitest的资源,我已经创建了一个简单的项目,希望它能帮助任何人快速轻松地入门:


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

    迷你测试水豚实际上没有提供这一功能。这更准确地回答了OP的问题,因为使用
    迷你测试元数据
    gem允许您将
    :js=>true
    散列传递到
    it
    块,就像在RSpec中一样。这避免了在每个测试方法中都需要方法调用,就像在接受的答案中一样。如果包含gem自述文件中的
    :before
    :after
    块(参见链接),而不是显示的不完整代码,那么答案会有所改进。您不能在minitest中的
    it“应该这样做”do
    级别指定:js=>true。仅在主
    description
    块中。如何在Test::Unit上使用Js是一个问题。说要像当前答案一样使用冗长的
    Capybara.current\u driver=
    。这理论上可能会回答这个问题,但最好将答案的基本部分包含在这里,供未来用户使用,并提供链接供参考。通过链接到您自己的库不是一个好的答案。链接到它,解释它解决问题的原因,提供使用库来解决问题的代码,以及免责声明,这些都是更好的答案。见: