Как динамически получить доступ/определить строку таблицы с помощью драгоценного камня pageobject?

у меня такая таблица

<iframe title="ManageLegs">
    <table title="Leg Details">
        <tr>
            <th />
            <th class="headerRow"><div>Dep Date</div></th>
            <th class="headerRow"><div>ETD</div></th>
        </tr>
        <tr>
            <td>1</td>
            <td>2015-02-01</td>
            <td>0900</td>
        </tr>
        <tr>
            <td>2</td>
            <td>2015-02-15</td>
            <td>1100</td>
        </tr>
    </table>
</iframe>

Каждая строка имеет свой номер в первой ячейке. Дело в том, что количество строк варьируется, и при определении PageObject для этого сайта я не знаю, сколько строк будет.

В настоящее время я использую этот код в PageObject для доступа к ячейкам таблицы.

in_iframe(:title => 'ManageLegs') do |frame|
    table(:leg_details, title: 'Leg Details', :frame => frame)

    # 1st leg
    text_field(:departure_date1) { leg_details_element['1']['Dep Date'].text_field_element }

    # 2nd leg
    text_field(:departure_date2) { leg_details_element['2']['Dep Date'].text_field_element }

    # 3rd leg ...
    # ...
end

Но это совсем не СУХОЕ. Любые советы о том, как упростить это?

Спасибо заранее, Кристиан


person Christian Baumann    schedule 06.02.2015    source источник


Ответы (2)


Лично мне нравится определять строки как виджеты. Это обеспечивает описательный API для страницы.

Класс Leg для представления строки:

class Leg < PageObject::Elements::TableRow
  def index
    cell_element(index: 0).text
  end

  def dep_date
    cell_element(index: 1).text
  end

  def etd
    cell_element(index: 2).text
  end
end
PageObject.register_widget :leg, Leg, :tr

Объект страницы:

class MyPage
  include PageObject

  in_iframe(:title => 'ManageLegs') do |frame|
    legs(:leg) do
      table_element(:title => 'Leg Details', :frame => frame)
        .leg_elements(:tag_name => 'tr')[1..-1]
    end
  end
end

Пример использования:

page = MyPage.new(browser)
page.leg_elements.each do |leg|
  p leg.index
  p leg.dep_date
  p leg.etd
end
#=> "1"
#=> "2015-02-01"
#=> "0900"
#=> "2"
#=> "2015-02-15"
#=> "1100"
person Justin Ko    schedule 06.02.2015
comment
Это кажется большим количеством кода, чем другой ответ, но в долгосрочной перспективе может быть очень удобно иметь в вашем коде один объект, такой как «leg_elements», который содержит все данные из таблицы. это может сделать прохождение проверок намного чище, особенно если вы используете что-то вроде огурца, и шаг проверки проходит в таблице огурца, которую вы затем сравниваете с вашим объектом, который содержит фактические результаты. - person Chuck van der Linden; 09.02.2015
comment
Спасибо, Джастин, это выглядит очень многообещающе. К сожалению, при попытке выполнить это не удается, выдавая эту ошибку undefined method legs' для CharterInquirySavedPage:Class (NoMethodError)`, которая ссылается на этот фрагмент кода: legs(:leg) do - person Christian Baumann; 09.02.2015
comment
Это работало локально для меня. Вы прописали виджет - строку PageObject.register_widget :leg, Leg, :tr? Также какую версию драгоценного камня page-object вы используете? Коллекции виджетов (т.е. legs) — это более поздняя функция. - person Justin Ko; 09.02.2015
comment
Я пропустил регистрацию виджета, теперь он работает. Большое спасибо! - person Christian Baumann; 10.02.2015

Просто напишите метод на своей странице:

in_iframe(:title => 'ManageLegs') do |frame|
  table(:leg_details, title: 'Leg Details', :frame => frame)      
end

def departure_date(number)
  leg_details_element[number]['Dep Date'].text_field_element
end
person Evmorov    schedule 06.02.2015