我有一个搜索过滤器。我需要能够检查页面上的所有字段是否存在并包含值(如果它们是选择框)。
我已经使用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>
答案 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