2013-04-22 36 views
2

我有一个搜索过滤器。我需要能够检查页面上的所有字段都存在并包含值(如果它们是选择框)。迭代页面对象的所有元素

我已经使用了MethodFinder gem来成功地做到这一点,但我想知道是否有任何与PageObject gem的方式。

require 'methodfinder' 

class BasicSearchFilter 
    include PageObject 

    text_field(:facility_name, :id => "facility-name") 
    text_field(:queue, :id => "queue") 
    select_list(:from, :id => "from") 
    button(:continue, :id => "continue") 

    def get_search_filter_elements 
    methods = MethodFinder.find_in_class_or_module('BasicSearchFilter', '.*_element$') 
    elements = [] 
    methods.each do |method| 
     elements << send(method) 
    end 
    end 
end 

我已经成功地使用了上述,但现在我无法使用我想要做的页面对象方法。我希望能够以某种方式提交一个有效的“元素”列表,这些元素只是PageObject版本的元素。

编辑:所以事实证明,一些非常可怕的事情正在发生。 我有一个RSpec测试从上面的类中获取字段。它看起来像这样:

it "the basic filter dropdowns should not contain duplicate values" 
    on_page(BasicSearchFilter).get_search_filter_elements.each do |element| 
    if element.tag_name == "select" 
     p element 
     puts "a select tag #{element}" 
    end 
    end 
end 

现在根据文档your_element_element命令应该返回的Watir元素。发生过一次。第二个投入是以某种方式改回到PageObject对象。我现在完全不知道发生了什么。这是上面的一些输出。

#<Watir::Select:0x4c6bdfa4 located=true selector={:id=>"facility-name", :tag_name=>"select"}> 
a select tag #<PageObject::Elements::SelectList:0x3101538> 

回答

1

让所有元素

虽然页面对象宝石没有一个方法来获取所有的元素,你可以使用普通的Ruby做到这一点。以下将为您提供与当前方法相同的结果(假设MethodFinder按预期工作)。像你一样

def get_search_filter_elements 
    element_methods = self.class.instance_methods(false).find_all{ |m| m =~ /_element$/ } 
    elements = element_methods.collect{ |m| self.send(m) } 
    end 

遍历元素

遍历由get_search_filter_elements返回的元素就完成了。然而,有几件事与你的观察有关。

your_element_element方法返回PageObject元素(不是Watir元素)。这可通过输出类的元素可以看出返回:

page.get_search_filter_elements.each{ |e| puts e.class } 
#=> PageObject::Elements::TextField 
#=> PageObject::Elements::TextField 
#=> PageObject::Elements::SelectList 
#=> PageObject::Elements::Button 

具有的Watir元件和所述的输出则PageObject元件不是因为元件已改变的类型。它始终是PageObject元素。输出变化,因为你做p vs puts。当您输入p对象时,.inspect方法被输出,其中当您输入对象时,输出方法.to_s。鉴于PageObject元素被写入的方式,.to_s提供了关于PageObject元素的信息,而.inspect给出了关于本地元素(即Watir或Selenium)的信息。

page.queue_element.to_s 
#=> <PageObject::Elements::TextField:0x3851ca0> 

page.queue_element.inspect 
#=> #<Watir::TextField:0x1d58cb4 located=false selector={:id=>\"queue\", :tag_name=>\"input or textarea\", :type=>\"(any text type)\"}> 

转换为本地元素

如果你真的想遍历的Watir元素(即你要调用不是由PageObject支持的方法),您使用element方法。例如,以下迭代元素为Watir元素:

page.get_search_filter_elements.each{ |e| puts e.element.class } 
#=> Watir::TextField 
#=> Watir::TextField 
#=> Watir::Select 
#=> Watir::Button