【问题标题】:How to extend page-object to include non-standard HTML Elements如何扩展页面对象以包含非标准 HTML 元素
【发布时间】:2021-01-22 20:35:11
【问题描述】:

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

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

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

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

我想做的是创建一个 mat-chip 类并将其连接起来,这样我就可以像从页面对象中选择复选框一样使用它。我只是无法弄清楚必须连接的所有部件。

【问题讨论】:

  • 尝试查看Page-Object wiki for custom elements。如果您遇到问题/疑问,请告诉我。
  • 出于好奇,您希望从 mat-chip 元素中使用哪些其他行为?
  • @titusfortner,mat-chip 只是一个美化的复选框,真的。我想要的只是让它支持基本的复选框功能,例如“选中、取消选中和已选中”。现在我能确定它是否被选中的唯一方法是使用元素(名称、类、文本)对 mat-chip 进行两个定义。一种使用 mat-chip 作为类,一种使用 mat-chip-selected。如果一个存在,则另一个不存在。此解决方案不是最佳解决方案。
  • @JustinKo,您的示例使用标签与隐藏的收音机进行交互。我没有这样的元素。所以,我什至不确定如何识别或定位 mat-chip。这是 html 的样子: 公开

标签: watir page-object-gem


【解决方案1】:

我不是 Angular 人,所以我从 https://stackoverflow.com/a/47962183/1200545 偷了一个可点击的 mat-chip 示例。根据您的实现,您可能需要调整以下代码。

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

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

然后我们可以在 Page-Object 中创建一个小部件和访问器:

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

【讨论】:

  • 哇...谢谢,贾斯汀。我继续并将其标记为已回答,即使我没有连接此代码。如果它不起作用,我确定这是我的错误。谢谢!
  • 已更新:一切都已连接好,并且运行良好。再次感谢!
  • 我记录了这个问题,github.com/cheezy/page-object/issues/500#issue-793622287,以便为这种情况提供更好的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2011-12-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多