2014-07-04 3 views
1

Я новичок в Ruby, и я ЛЮБЛЮ ЭТО. Игра с Watir-Webdriver. Я хочу сохранить ссылку на объекты watir в хеше и сохранить их на диск, БЕЗ определения первой переменной @browser. НапримерRuby/Watir - хранит объекты watir в хеше?

elements = { 
    :home => @browser.a(:href => /home.php/), 
    :photo => @browser.img(:id => "photo"), 
    :about => @browser.a(:href => /about.php/) 
} 

так, что дальше я могу сделать что-то вроде:

el = elements 
el[:home].click 
el[:photo].wait_until_present 
el[:about].click 

Очевидно, что это работает, если я определить @browser в самом начале ..

@browser = Watir::Browser.new 

но что, если Я хочу сохранить хеш элементов как YAML в файле? Должен ли я хранить значения в качестве цитируемых строк и оценивать их на лету? например

elements = { 
    :home => "@browser.a(:href => /home.php/)", 
    # etc... 
} 

# store elements as YAML file... 
# load elements from YAML file 

el = YAML::load_file "elements.yml" 
eval(el[:home]).click 
eval(el[:photo].wait_until_present 

# etc... 

есть ли лучший способ сделать это?

+0

Можете ли вы, возможно, выяснить, почему вы хотите это сделать? Я предполагаю, что вам, вероятно, стоит подумать об использовании шаблона объекта страницы. Примером может служить [Жемчужина страницы сайта Cheezy] (https://github.com/cheezy/page-object). –

ответ

0

Постройте a Class, чтобы предоставить доступ к @browser на основе вашего YAML config.

Измените структуру elements, чтобы включить данные, которые вам нужны, а не код. Рассмотрим этот хэш-файл конфигурации для вашего нового класса.

elements = { 
    :home => { :tag => "a", :select => { :href => /home.php/ } }, 
    :photo => { :tag => "img", :select => { :id => "photo" } }, 
    :about => { :tag => "a", :select => { :href => /about.php/ } } 
} 

Построить класс для загрузки файла elements YAML и обеспечить доступ к тому, что вам нужно от @browser на основе того, что загружается.

class WatirYamlBrowserSelect 

    # To store your config and browser. 
    attr_accessor :elements, :browser 

    def initialize elements_yaml_file 
    @elements = YAML.load_file elements_yaml_file 
    end 

    # Retrieve a configured element from Watir Browser. 
    def element name 
    @browser.send(@elements[name][:tag], @elements[name][:select]) 
    end 

end 

Затем, когда вам нужно использовать его блог

# Create an instance of your selector. 
s = WatirYamlBrowserSelect.new("elements.yaml") 

# Add the browser when you have it 
s.browser @browser 

# Access the @browser elements 
s.element :home 
s.element :photo 
s.element :about 
0

Алистера Скотта, а также его код в GitHub был шаблон я использовал для создания всех объектов страницы для нескольких проектов. Я думаю, что это должно решить проблемы повторения, которые вы описали. Он также решает проблему сохранения слишком большого количества переменных для слишком большого количества страниц объектов и сохраняет объекты, организованные страницей, а не в более сложной структуре данных, особенно когда число объектов увеличивается.

http://watirmelon.com/2011/06/07/removing-local-page-references-from-cucumber-steps/ http://watirmelon.com/2012/06/04/roll-your-own-page-objects/ https://github.com/alisterscott/wmf-custom-page-object

Смежные вопросы