我正在使用page-object-gem并尝试在一组text_field具有无限次出现次数时找到定义页面元素的最佳方法。
页面加载的HTML类似于以下内容:
<div><input id="dx_1_code" value=""/> <input id="dx_1_dos" onblur="clone($(this),false)" value=""/></div>
如果用户选中了最后一个输入,那么克隆一个新行,其id值随HTML递增,如下所示:
<div><input id="dx_2_code" value=""/> <input id="dx_2_dos" onblur="clone($(this),false)" value=""/></div>
<div><input id="dx_3_code" value=""/> <input id="dx_3_dos" onblur="clone($(this),false)" value=""/></div>
我的第一次尝试是按如下方式定义我的课程:
class SamplePage
include PageObject
include DataMagic
text_field(:dx_1, :id => "dx_1_code")
text_field(:dx_2, :id => "dx_2_code")
text_field(:dos_1, :id => "dx_1_dos")
text_field(:dos_2, :id => "dx_2_dos")
end
然而,我很快就收到了大量的冗余条目。
在元素设置和populate_page_with方法的使用方面,有没有更好的方法来处理这样的未知数字或条目?
答案 0 :(得分:1)
元素已编制索引,这使它们成为索引属性功能的理想选择。 indexed_property
允许您定义在访问元素时替换数字的定位器。页面对象看起来像:
class MyPage
include PageObject
indexed_property(:dx, [
[:text_field, :code, {id: 'dx_%s_code'}],
[:text_field, :dos, {id: 'dx_%s_dos'}],
])
end
然后使用以下方式输入前两行:
page = MyPage.new(browser)
page.dx[1].code = 'a'
page.dx[1].dos = 'b'
page.dx[2].code = 'c'
page.dx[2].dos = 'd'
不幸的是,populate_page_with
方法没有内置的方法来处理索引属性。与任何事情一样,你可以破解某些东西。 populate_page_with
方法查找&#34;元素&#34;方法以及setter方法。通过将自己的内容添加到页面对象中,可以使用该方法。
class MyPage
include PageObject
indexed_property(:dx, [
[:text_field, :code, {id: 'dx_%s_code'}],
[:text_field, :dos, {id: 'dx_%s_dos'}],
])
# Method for inputting the various dx code/dos values based on a Hash
def dx=(values)
values.each_pair do |index, fields|
fields.each_pair do |field, value|
dx[index].send("#{field}=", value)
end
end
end
# This is so that populate_page_with can check that the element is enabled/visible
def dx_element
dx[1].code_element
end
end
这将使您能够通过发送哈希来使用populate_page_with
,其中键是索引,值是该索引的字段/值。我们之前做过的页面输入现在可以写成:
page = MyPage.new(browser)
page.populate_page_with(dx: {
1 => {code: 'a', dos: 'b'},
2 => {code: 'c', dos: 'd'}
})