Ruby 为什么';my instance变量是否指向Watir::Browser实例?
我真的很困惑。我在自动化测试套件中使用下面的Ruby类:Ruby 为什么';my instance变量是否指向Watir::Browser实例?,ruby,oop,attr-accessor,Ruby,Oop,Attr Accessor,我真的很困惑。我在自动化测试套件中使用下面的Ruby类: class FlightSearchPage attr_accessor :page_title def initialize(browser, page) @browser = browser @start_url = page end def method_missing(sym, *args, &block) @browser.send sym, *args, &
class FlightSearchPage
attr_accessor :page_title
def initialize(browser, page)
@browser = browser
@start_url = page
end
def method_missing(sym, *args, &block)
@browser.send sym, *args, &block
end
@page_title = @browser.title
#def page_title
# @browser.title
#end
end
我将其子类化为:
class BrandFlightsPage < FlightSearchPage
def initialize(browser, page, brand)
super(browser, page)
[...snip...]
end
end
class BrandFlightsPage
当我实例化子类时,传入@browser,一个watir webdriver对象@browser.title抛出:
nil:NilClass(NoMethodError)的未定义方法“title”
但是,如果我在FlightSearchPage中取消对page_title方法的注释,它将按预期工作。我还尝试了构造函数中的变量赋值
我绕了一圈试图找到这个,但我就是看不到
这是stacktrace:
undefined method `title' for nil:NilClass (NoMethodError)
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/flight_search_page.rb:13:in `<class:FlightSearchPage>'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/flight_search_page.rb:1:in `<top (required)>'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/brand_flight_search_page.rb:1:in `<top (required)>'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/features/step_definitions/steps.rb:1:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_support/rb_language.rb:129:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_support/rb_language.rb:129:in `load_code_file'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:171:in `load_file'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:83:in `block in load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in `each'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in `load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:175:in `load_step_definitions'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:40:in `run!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:43:in `execute!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:20:in `execute'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/bin/cucumber:14:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in `<main>'
nil:NilClass(NoMethodError)的未定义方法“title”
/Users/Dazzla/Dropbox/src/Projects/over\u the\u watir/pages/flight\u search\u page.rb:13:in`'
/Users/Dazzla/Dropbox/src/Projects/over\u the\u watir/pages/flight\u search\u page.rb:1:in`'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site\u ruby/1.9.1/rubygems/custom\u require.rb:55:in'require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site\u ruby/1.9.1/rubygems/custom\u require.rb:55:in'require'
/用户/Dazzla/Dropbox/src/Projects/over\u the\u watir/pages/brand\u flight\u search\u page.rb:1:in`'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site\u ruby/1.9.1/rubygems/custom\u require.rb:55:in'require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site\u ruby/1.9.1/rubygems/custom\u require.rb:55:in'require'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/features/step_definitions/steps.rb:1:in`'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_-support/rb_-language.rb:129:in'load'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_-support/rb_-language.rb:129:在“加载代码文件”中
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:171:in'load_file'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:83:in`block in load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in'each'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in'load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:175:在“加载步骤定义”中
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:40:in'run!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:43:in'execute!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:20:in'execute'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/bin/cucumber:14:in`'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in'load'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in`'
这是因为
attr_accessor :page_title
已经创建了一个getter和一个setter
我会把这个
@page_title = @browser.title
在初始化方法中
class FlightSearchPage
attr_accessor :page_title
def initialize(browser, page)
@browser = browser
@page_title = @browser.title
@start_url = page
end
def method_missing(sym, *args, &block)
@browser.send sym, *args, &block
end
end
或者(更好)删除属性访问器,只添加一个方法
class FlightSearchPage
def initialize(browser, page)
@browser = browser
@start_url = page
end
def method_missing(sym, *args, &block)
@browser.send sym, *args, &block
end
def page_title
return @browser.title unless @browser
"browser not set, no title"
end
end
正在实例化浏览器:
该文件位于名为env.rb的文件中,该文件在每次测试之前运行:
Before do
@browser = Watir::Browser.new
end
它是在cucumber's World当前实例的上下文中运行的
我不明白的是,除此之外,所有其他浏览器方法在使用访问器实现时都能正常工作。谢谢-我现在实际上已经恢复使用方法,因为在调用@browser.title时,将赋值放在构造函数中会返回空字符串。是的,因此,最好的方法是二等舱。只需检查浏览器是否为零。我更新了这个例子。谢谢-你知道为什么调用Browser#title会产生一个空字符串吗?不知道,页面有标题吗?也许这是一个时间问题?是的,确实如此-正如我所说的,它在使用该方法时按预期工作,但在实现为attr_访问器或attr_读取器时却不能。