Переключение между iframe во время выполнения сценария

Привет, ребята! Мы используем watir-webdriver с огурцом и гемом-объектом страницы, предоставленным Cheezy. Наш проект использует ExtJS, поэтому здесь много ajax. В одном из наших сценариев есть шаг, когда пользователь нажимает кнопку (в iframe, скажем, iframe1), и система заполняет ту же страницу в другом iframe (скажем, frame2), в нашем классе PageObject у нас есть что-то вроде этого:

in_iframe (: width => "100%") do | frame | // некоторые элементы заканчиваются

Итак, вопросы: есть ли способ создать экземпляр нового PageObject с конкретным iframe или изменить iframe для текущего используемого PageObject?

Буду признателен за любую помощь.


person Smooyk    schedule 11.07.2014    source источник
comment
Можете ли вы пояснить, что вы подразумеваете под конкретным iframe и почему вам нужно изменить iframe? Судя по описанию проблемы, это просто звучит так, как будто у вас есть два элемента в двух разных фреймах, что означает наличие двух аксессоров in_iframe?   -  person Justin Ko    schedule 11.07.2014
comment
Извините, постараюсь подробнее описать свою проблему. С самого начала мои шаги работают только с одним iframe - iframe1, а затем во время тестового запуска драйвер нажимает кнопку, которая создает iframe2, все дальнейшие шаги должны выполняться в iframe2, но драйвер продолжает взаимодействовать с элементами в iframe1 (Причина iframe1 и iframe2 имеют одинаковые элементы). Поэтому я хотел бы сделать что-то вроде этого: @ current_page.frame = browser.iframes (: width = ›100%) [1], чтобы изменить текущий рабочий iframe для драйвера.   -  person Smooyk    schedule 11.07.2014
comment
У меня была аналогичная проблема, и в конечном итоге мне пришлось отказаться от драгоценного камня Cheezy в пользу собственной, как описано здесь Алистером Скоттом: watirmelon.com/2012/06/04/roll-your-own-page-objects   -  person Abe Heward    schedule 11.07.2014
comment
Подробности моего собственного решения можно найти в первых 10 строках этого файла: github.com/aheward/kuality-coeus/blob/master/lib/kuality-coeus/   -  person Abe Heward    schedule 11.07.2014
comment
Спасибо! Я попробую.   -  person Smooyk    schedule 11.07.2014


Ответы (1)


Я представляю вашу страницу такой:

<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>

Другими словами, есть два фрейма с одним и тем же элементом текстового поля.

Это кажется немного взломанным, но один из подходов, который вы могли бы использовать, - это определить различные методы элементов. Когда вы переключаете кадры, вы можете переопределить методы использования локатора для второго кадра. Объект страницы будет:

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'
person Justin Ko    schedule 11.07.2014