我应该如何用水豚测试硒应用?

时间:2012-02-10 16:17:33

标签: selenium rspec capybara remote-server

这是我的问题:

我正在编写一个应用程序使用selenium-webdriver连接到网站点击/填充一堆东西。

显然,我想测试我的代码 ......这就是困难的地方!我该怎么做?

这是我的测试:

require 'spec_helper'
require 'capybara/rspec'

module MyModule
  Capybara.run_server = false

  describe "the method", :type => :request do
    it "should open a browser and go to the site" do
      MyClass.open_site("http://google.com")
      page.has_content? "Google"
    end
  end
end

以下是代码:

require 'selenium-webdriver'

module MyModule
  class MyClass
    def self.open_site(url)
      @driver = Selenium::WebDriver.for :firefox
      @driver.navigate.to url 
    end
  end
end

以下是我遇到的错误:

Failures:

  1) the method should open a browser and go to the site
     Failure/Error: page.has_content? "Google"
     ArgumentError:
       rack-test requires a rack application, but none was given
     # (eval):2:in `has_content?'
     # ./spec/integration/myclass_spec.rb:10

我可以理解测试很困惑,因为通常Capybara运行Selenium来访问网站并检查一切看起来是否正常。但是这里Selenium作为代码的一部分独立运行......

我怎么能告诉rack-test使用正在运行的Selenium作为它的应用程序?

Capybara甚至是测试此代码的正确解决方案吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您正在使用的其中一项功能必须是使用机架应用程序。

问题不应该在以下行:

page.has_content? "google"

因为硒驱动器对我来说效果很好。我怀疑这是你设置驱动程序的方式。

在我发现这些帖子之前,我遇到了类似的问题:google groups

他们给了我一些指导让我的测试运行。 最后,我最终得到了这些线来配置我的测试。 我正在使用chrome但是Internet Explorer和firefox也会这样工作。

require 'selenium-webdriver'

Capybara.register_driver :selenium_ie do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Capybara.default_driver = :selenium_chrome

Capybara.app_host = 'http://www.google.com'

答案 1 :(得分:0)

这是我使用运行MongoDB的Sinatra应用程序所做的。评论硒代码,尝试没有水豚的纯硒。安装test-unitcapybaracapybara-webkitselenium-webdriver宝石。对于capybara-webkit做brew install qt4(mac)或以另一种方式安装qt4。

require './app'
require 'test-unit'
require 'capybara'
require 'capybara-webkit'
require 'selenium-webdriver'

class IntegrationTest < Test::Unit::TestCase  
  include Capybara::DSL

  def setup
    # Clear database first
    MongoMapper.database.collections.select { |c| c.name != 'system.indexes' }.each(&:drop)

    # For pure selenium: @b = Selenium::WebDriver.for :firefox
    # For pure selenium: @w = Selenium::WebDriver::Wait.new(:timeout => 15)

    Capybara.run_server = false
    Capybara.default_selector = :css
    Capybara.default_wait_time = 5
    Capybara.ignore_hidden_elements = false
    Capybara.javascript_driver = :webkit  # Comment out to use :selenium
    Capybara.default_driver = Capybara.javascript_driver
    Capybara.app = Sinatra::Application.new
    Capybara.app_host = "http://crowdfundhq.dev:3001"
    Capybara.server_port = 3001
  end

  def teardown
    # For pure selenium: @b.quit
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end

  def test_root
    # For pure selenium: @b.get "http://crowdfundhq.dev:3001"
    # For pure selenium: assert @b.page_source =~ /#pricing/

    # Change driver during test: Capybara.current_driver = Capybara.javascript_driver    

    visit("/")
    assert(page.body =~ /highlight/)
  end  
end