有没有一种方法可以定义 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')
我正在使用 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')