迭代页面对象的所有元素

时间:2013-04-22 20:08:26

标签: ruby page-object-gem

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

我已经使用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 个答案:

答案 0 :(得分:1)

获取所有元素

虽然page-object-gem没有获取所有元素的方法,但你可以使用普通的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方法,而当您puts某个对象时,会输出.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