解决方案 1 - 使用正则表达式
与我最初的假设相反,该in_frame
方法不支持使用正则表达式定位框架(第 197 期)。但是,可以对功能进行猴子修补。在需要页面对象的地方,添加以下代码以猴子匹配nested_frames
方法。
require 'watir-webdriver'
require 'page-object'
module PageObject
module Platforms
module WatirWebDriver
class PageObject
def nested_frames(frame_identifiers)
return if frame_identifiers.nil?
frame_str = ''
frame_identifiers.each do |id|
value = id.values.first
if value.is_a?(Regexp)
frame_str += "frame(:#{id.keys.first} => #{value.inspect})."
else
frame_str += "frame(:#{id.keys.first} => #{value})." if value.to_s.is_integer
frame_str += "frame(:#{id.keys.first} => '#{value}')." unless value.to_s.is_integer
end
end
frame_str
end
end
end
end
end
然后,这允许您使用正则表达式来定义框架的 src(使用时in_frame
):
class MyPage
include PageObject
in_frame(:src => /MyApplicantPortal\/Applicant\/\d+\/SelectOrderTemplate\?t=1/) do |frame|
select_list(:template, :id => 'selectlisname', :frame => frame)
end
end
请注意,在正则表达式中,您需要转义字符\*?{}.
。该\d+
部分表示将匹配任何数字。
解决方案 2 - 定义一个 frame_element
如果您不想修补页面对象 gem,那么您可以:
- 定义框架元素(使用正则表达式)
- 使用引用框架元素的块来定义选择列表
这看起来像:
class MyPage
include PageObject
element(:select_order, :frame, :src => /MyApplicantPortal\/Applicant\/\d+\/SelectOrderTemplate\?t=1/)
select_list(:template){ select_order_element.select_list_element(:id => 'selectlisname') }
end