有没有一种方法可以定义 text_field 元素类型,将 send_key 作为默认集

is there a way to define a text_field element type that does send_key as default set

我正在使用 page-object-gem 和 populate_page_with 方法以及 datamagic gem。 我的测试应用程序中有几个 text_fields 需要 send_keys 的值,然后是 send_keys :tab。 如果我通过 text_field 元素的默认方法设置值,应用程序将无法运行。

当我遇到这些发送键类型字段之一时,我只是在页面 class 中删除了一个方法,如下所示:

class SampleThing

   include  PageObject
   include  PageObject::PageFactory
   include  DataMagic

   text_field(:dos_start, :id => 'DOSStart')
   text_field(:beg_page, :id => 'BegPage')
   text_field(:end_page, :id => 'EndPage')


  def populate_page(datakey)
     my_data = data_for datakey
     self.set_dos_start(my_data['dos_start']) 
     self.beg_page= my_data['beg_page']
     self.end_page= my_data['end_page'] 
  end

  def set_dos_start(my_data)
     self.dos_start_element.send_keys my_data
     self.dos_start_element.send_keys :tab
  end
end

有没有更好的方法来解决这个问题并创建一个自定义元素类型,让我可以在页面对象中定义它,并在本质上消除我编写 popuate_page 代码的需要?

 sendkey_field(:dos_start, :id => 'DOSStart')

您可以使用小部件功能来创建自己的控件和访问器。定义小部件时,默认情况下它只创建 return 元素的方法并检查它是否存在。但是,您可以使用 accessor_methods 定义将为页面对象创建的其他方法 - 在本例中为 setter 方法。

控件将 created/registered 如下所示。请注意,您希望 setter 方法被调用 #{name}= 以便它可以在 populate_page_with 方法中使用。

class SendkeyField < PageObject::Elements::TextField
  def self.accessor_methods(accessor, name)
    accessor.send(:define_method, "#{name}=") do |value|
      self.send("#{name}_element").send_keys(value, :tab)
    end
  end
end

PageObject.register_widget :sendkey_field, SendkeyField, :text_field

这将为您提供所需的访问器:

class MyPage
  include PageObject

  sendkey_field(:dos_start, :id => 'DOSStart')
end

以及单独设置字段的能力:

page.dos_start = 'value'

或者使用内置的populate_page_with方法:

page.populate_page_with(dos_start: 'value')