gpt4 book ai didi

ruby - 遍历页面对象的所有元素

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:53 25 4
gpt4 key购买 nike

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

我已经使用 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 元素。这是发生一次。第二个 puts 以某种方式变回 PageObject 对象。我现在完全不知道发生了什么。这是上面的一些输出。

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

最佳答案

获取所有元素

虽然 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 元素。输出发生变化,因为您执行 pputs。当您p 一个对象时,.inspect 方法被输出,而当您puts 一个对象时,.to_s方法输出。鉴于 PageObject 元素的编写方式,.to_s 提供有关 PageObject 元素的信息,而 .inspect 提供有关 native 元素(即 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

关于ruby - 遍历页面对象的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com