在场景运行期间在iframe之间切换

时间:2014-07-11 06:13:54

标签: cucumber watir-webdriver page-object-gem

赫洛,伙计们! 我们正在使用由Cheezy提供的黄瓜和页面对象gem的watir-webdriver。我们的项目使用ExtJS,因此有很多ajax。在我们的一个场景中有一个步骤,当用户点击按钮(在iframe中,假设iframe1)并且系统在不同的iframe中填充相同的页面(比如说frame2),在我们的PageObject类中我们有这样的东西:

in_iframe(:width =>“100%”)do | frame |   //一些元素 端

那么,问题是有一种方法可以使用具体的iframe实例化新的PageObject或更改当前使用的PageObject的iframe吗?

将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:3)

我正在设想您的网页如下:

<html>
  <body>
    <iframe id="iframe1" src="test.htm" width="100%"></iframe>
    <iframe id="iframe2" src="test.htm" width="100%"></iframe>
  </body>
</html>

test.htm是:

<html>
  <body>
    <input id="user_login" type="text">
  </body>
</html>

换句话说,有两个框架具有相同的文本字段元素。

这看起来有点hacky,但你可以采取的一种方法是定义各种元素方法。切换帧时,可以重新定义方法以使用第二帧的定位器。页面对象是:

class MyPage
  include PageObject 

  def self.setup(iframe_locator)
    in_iframe(iframe_locator) do |login_iframe|
      text_field(:email_field, :id => 'user_login', frame: login_iframe)
    end 
  end
  setup(:width => "100%")

  def frame=(iframe_locator)
    eval %Q{
      class << self
        setup(#{iframe_locator})
      end
    }
  end
end

用法是:

page = MyPage.new(browser)

# Input the text field in the first frame
page.email_field = 'hi'

# Redefine the frame locator to be the second frame
page.frame={:index=> 1, :width=>'100%'}

# Input the text field in the second frame
page.email_field = 'bye'