2

这是我的问题:

我正在编写一个使用 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 甚至是测试此代码的正确解决方案吗?

谢谢你的帮助!

4

2 回答 2

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'
于 2012-08-01T11:28:02.283 回答
0

这是我对运行 MongoDB 的 Sinatra 应用程序所做的。注释掉 selenium 代码以尝试没有 capybara 的纯 selenium。安装test-unit, capybara, capybara-webkit, selenium-webdrivergems。对于 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
于 2013-10-14T22:26:59.700 回答