0

我正在尝试在 iFrame 内的下拉列表中选择一个值。框架不包含 id,但有一个动态的 src。

/MyApplicantPortal/Applicant/244029/SelectOrderTemplate?t=1

HTML:

<html class = ......>

. . .

数字 244029 发生了变化,因此,我无法识别框架内的对象。iframe 是 div 的子元素。

我的代码是

in_frame(:src => 'MyApplicantPortal/Applicant/244025/SelectOrderTemplate?t=1') do |frame|
select_list(:template, :id => 'selectlisname', :frame => frame)

结尾

4

1 回答 1

0

解决方案 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,那么您可以:

  1. 定义框架元素(使用正则表达式)
  2. 使用引用框架元素的块来定义选择列表

这看起来像:

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
于 2013-11-13T22:41:42.827 回答