【问题标题】:How to use plural Page-Object widgets如何使用多个 Page-Object 小部件
【发布时间】:2019-12-31 07:14:47
【问题描述】:

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

我找不到多个元素,这意味着我找不到元素数组。

如果我的小部件的标签是some-widget,这可行:

some_widget_element(id: 'some-id')

但这不起作用:

some_widget_elements(id: 'some-id')

我试图通过 id 查找多个元素,这就是页面的结构。

我得到错误:

NoMethodError: undefined method 'new' for nil:NilClass

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

【问题讨论】:

标签: ruby page-object-gem


【解决方案1】:

注册一个小部件将定义两者:

  • 页面级访问器以及
  • 嵌套元素定位器

作为一个例子,我们假设下面的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2014-08-28
    • 2012-05-08
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多