注册一个小部件将定义两者:
作为一个例子,我们假设下面的 HTML:
<html>
<body>
<div>empty</div>
<div>
<some-widget id="some-id">a</some-widget>
<some-widget id="some-id">b</some-widget>
<other id="some-id">c</other>
</div>
<some-widget id="some-id">d</some-widget>
</body>
</html>
同样,我们已经注册了这个小部件:
class SomeWidgetClass < PageObject::Elements::Element
PageObject.register_widget :some_widget, self, :element
end
嵌套元素
创建的嵌套元素方法的格式为“{widget_tag}_elements”。
class TestPage
include PageObject
def nested_in_page
some_widget_elements(id: 'some-id', tag_name: 'some-widget')
end
def nested_in_element
div_elements[1].some_widget_elements(id: 'some-id', tag_name: 'some-widget')
end
end
page = TestPage.new(browser)
p page.nested_in_page.map(&:text)
#=> ["a", "b", "d"]
p page.nested_in_element.map(&:text)
#=> ["a", "b"]
页面级访问器
默认情况下,用于返回所有匹配小部件数组的页面级访问器基于小部件的类名。这与您在注册小部件时定义的单一访问器方法不同。具体来说,方法名由以下表达式定义:
def self.plural_form
"#{self.to_s.split('::')[-1].
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
gsub(/([a-z\d])([A-Z])/, '\1_\2').
tr("-", "_").
downcase}s"
end
在我们的示例中,SomeWidgetClass 类将创建一个 some_widget_classs 方法:
class TestPage
include PageObject
some_widget_classs(:my_widgets, id: 'some-id', tag_name: 'some-widget')
end
page = TestPage.new(browser)
p page.my_widgets_elements.map(&:text)
#=> ["a", "b", "d"]
您可以通过为您的小部件定义plural_form 来覆盖访问器名称。下面将方法重命名为plural_widgets:
class SomeWidgetClass < PageObject::Elements::Element
def self.plural_form
:plural_widgets
end
PageObject.register_widget :some_widget, self, :element
end
class TestPage
include PageObject
plural_widgets(:my_widgets, id: 'some-id', tag_name: 'some-widget')
end
页面的实际用法没有变化——即仍然是page.my_widgets_elements。