如何扩展页面对象以包含非标准 HTML 元素

How to extend page-object to include non-standard HTML Elements

我正在寻找有关如何扩展页面对象 gem (github.com/cheezy/page-object) 以支持 Angular 等元素的教程或帮助芯片。此元素与复选框非常相似,但页面对象无法识别。我找到的最接近的东西在这里。

https://williamjamespowell.com/2012/12/01/extending-pageobjects/

https://williamjamespowell.com/2012/12/27/gxt-pageobject-widget-example/

这些示例已有 8 年历史,我不知道它们是否仍然有效。不幸的是,这就是我所发现的关于如何扩展页面对象功能的范围。

我想做的是创建一个 mat-chip class 并将其连接起来,这样我就可以像使用页面对象的复选框一样使用它。我只是不太清楚必须连接的所有部件是什么。

我不是 Angular 人,所以我从 那里偷了一个可点击的垫片示例。根据您的实施,您可能需要调整以下代码。

首先,Page-Object 在定义使用自定义标签名称(即“mat-chip”)的小部件时有一个限制。为了解决这个问题,我们将在 Watir 中定义一个关联的 method/locator:

module Watir
  module Container
    def mat_chip(*args)
      HTMLElement.new(self, extract_selector(args).merge(tag_name: "mat-chip"))
    end
    def mat_chips(*args)
      HTMLElementCollection.new(self, extract_selector(args).merge(tag_name: "mat-chip"))
    end
  end
end

然后我们可以在页面对象中创建一个小部件和访问器:

class MatChip < PageObject::Elements::Element
  def self.accessor_methods(widget, name)
    widget.send('define_method', "check_#{name}") do
      self.send("#{name}_element").check
    end

    widget.send('define_method', "uncheck_#{name}") do
      self.send("#{name}_element").uncheck
    end

    widget.send('define_method', "#{name}_checked?") do
      self.send("#{name}_element").checked?
    end
  end

  def set(bool = true)
    click unless set? == bool
  end
  alias check set

  def clear
    set(false)
  end
  alias uncheck clear

  def set?
    attribute_value('aria-selected') == 'true'
  end
  alias checked? set?

  PageObject.register_widget :mat_chip, self, :mat_chip
end

然后您可以使用名为“mat_chip”的访问器,与复选框相同:

class MyPage
  include PageObject

  mat_chip('mychip', index: 1)
end

page = MyPage.new(browser)
page.check_mychip
p page.mychip_checked?
#=> true
page.uncheck_mychip
p page.mychip_checked?
#=> false

或者,您可以直接使用 mat-chip 作为嵌套元素:

page.mat_chip_element.check
p page.mat_chip_element.checked?
#=> true
page.mat_chip_element.uncheck
p page.mat_chip_element.checked?
#=> false