Ruby / RSpec / WebDriver中的错误>预计会回应'has_content?'

时间:2016-10-05 23:24:46

标签: ruby selenium rspec

任何人都可以解释这个错误吗?

我的spec_helper.rb需要capybararspecselenium-webdriver

我的test_spec.rb文件包含以下内容:

require_relative 'spec_helper'

@browser = Selenium::WebDriver.for :firefox
@browser.get "http://www.google.com"

describe 'ErrorCheck' do
  it 'should log in to Trialnet' do
    expect(@browser).to have_content('Search')
  end
end

我的错误:

expected  to respond to `has_content?`
./spec/webdriver3_spec.rb:9:in `block (2 levels) in <top (required)>'
-e:1:in `load'
-e:1:in `<main>'

知道为什么这种期望会失败吗?它是否在没有正确语法的情况下返回布尔值来接受它?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为@browser实例变量不适用于it语句。请注意,您的错误消息没有引用它正在执行预期的对象(即expected to respond to 'has_content?'

这是一个人为的示威,表明它失败了:

require 'rspec'

@x = 1

describe 'One' do
  it 'should print 1' do
    expect(@x).to eq 1
  end
end

Failures:

  1) One should print 1
     Failure/Error: expect(@x).to eq 1

       expected: 1
            got: nil

并且 - 通过将实例变量移动到it语句中可用 - 示例传递:

require 'rspec'

describe 'One' do
  it 'should print 1' do
    @x = 1
    expect(@x).to eq 1
  end
end

1 example, 0 failures

并且 - 如果您使用let - 您可以创建一个可以跨示例共享的memoized变量:

require 'rspec'

describe 'One' do

  let(:x) { 1 }

  it 'should print 1' do
    expect(x).to eq 1
  end

  it 'should print 2' do
    expect(x+1).to eq 2
  end  

end

根据您的示例代码,您可以使用before块进行设置,然后使用subject,这可能比let更合适(注意:下面的代码段未经测试,并且letsubject之间的区别在其他SO答案,各种博客文章和rdoc中都有介绍:

describe 'ErrorCheck' do

  before :all do
    @browser = Selenium::WebDriver.for :firefox
    @browser.get "http://www.google.com"
  end

  subject(:browser) {@browser}       # or let(:browser) {@browser}

  it 'should log in to Trialnet' do
    expect(@browser).to have_content('Search')
  end
end