Почему моя переменная экземпляра не указывает на экземпляр Watir::Browser?
Я действительно смущен по этому поводу. Я использую класс 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, &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
Когда я создаю экземпляр подкласса, передавая @browser, объект watir-webdriver, @browser.title добавляет:
неопределенный метод `title'для nil:NilClass (NoMethodError)
Но если я раскомментирую метод page_title в FlightSearchPage, он будет работать как положено. Я также попробовал это с присваиванием переменной внутри конструктора.
Я ходил кругами, пытаясь отследить это, но я просто не вижу этого.
Вот трассировка стека:
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>'
1 ответ
Это потому что
attr_accessor :page_title
уже создает геттер и сеттер.
я бы поставил это
@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
или (лучше) удалите attr_accessor и просто добавьте метод
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
Он запускается в контексте текущего экземпляра мира огурца
Чего я не понимаю, так это того, что все другие методы браузера работают должным образом, если реализованы с помощью методов доступа, кроме этого.