Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用多个页面对象小部件_Ruby_Page Object Gem - Fatal编程技术网

Ruby 如何使用多个页面对象小部件

Ruby 如何使用多个页面对象小部件,ruby,page-object-gem,Ruby,Page Object Gem,我正在使用“”gem和Ruby,并使用“”作为参考创建了一个小部件 我找不到复数元素,这意味着我找不到元素数组 如果我的小部件的标签是somewidget,则此操作有效: some_widget_element(id: 'some-id') 但这不起作用: some_widget_elements(id: 'some-id') 我试图通过id找到多个元素,这就是页面的结构 我得到一个错误: NoMethodError: undefined method 'new' for nil:NilCl

我正在使用“”gem和Ruby,并使用“”作为参考创建了一个小部件

我找不到复数元素,这意味着我找不到元素数组

如果我的小部件的标签是
somewidget
,则此操作有效:

some_widget_element(id: 'some-id')
但这不起作用:

some_widget_elements(id: 'some-id')
我试图通过id找到多个元素,这就是页面的结构

我得到一个错误:

NoMethodError: undefined method 'new' for nil:NilClass

有什么我需要做/添加到我的Widget类中的吗?

注册Widget将定义以下两个方面:

  • 页面级访问器以及
  • 嵌套元素定位器
作为示例,让我们假设以下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>
页面级访问器

默认情况下,用于返回所有匹配小部件数组的页面级访问器基于小部件的类名。这与注册小部件时定义的单一访问器方法不同。具体而言,方法名称由以下表达式定义:

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
类将创建一个
somewidget\u 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"]
通过为小部件定义
复数形式
,可以覆盖访问者名称。下面将该方法重命名为
多个\u小部件

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
class SomeWidgetClass

页面的实际使用情况没有改变-即仍然是
页面。my_widgets\u elements

请参见“”。这是使用访问器还是使用嵌套元素调用?就我所知,两者都应该像你所期望的那样工作。@Justin Ko,两者都是如此。我不能像OP中所示那样做,也不能像我要做的那样做,例如,
div\u元素[1]。
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"]
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