Как перебрать таблицу объектов страницы

Какой самый простой способ проверить, что каждая строка в таблице имеет ссылку для редактирования?

пример кода:

class AccountPage
  include PageObject
  table(:cards, id: 'cards')
  link(:edit, href: /edit/)
end

Я хочу иметь возможность сделать что-то вроде этого:

page.cards_element.each do |card|
  card.edit? should == true
end

Это не сработает, так как каждый блок вернет строку таблицы PageObject, и единственный вариант - повторить итерацию снова, чтобы получить ячейки, и тогда, я полагаю, можно будет получить только текст ячейки.


person Rahul    schedule 15.04.2015    source источник


Ответы (1)


Решение 1. Вложенный локатор

Самым быстрым решением будет использование методов вложенных элементов при переборе строк таблицы.

class AccountPage
  include PageObject
  table(:cards, id: 'cards')
end

page = AccountPage.new(browser)
page.cards_element.each do |card|
  card.link_element(href: /edit/).visible?.should == true
end

Строка card.link_element(href: /edit/).visible? говорит о том, что для каждой карты (т.е. строки таблицы) проверьте наличие видимого элемента ссылки.

Решение 2. Виджет

Недостатком использования вложенного локатора является то, что детали страницы теперь находятся в тестовом коде, а не в объекте страницы. Это можно решить с помощью пользовательского виджета.

Вам нужно будет определить виджет, представляющий строку таблицы:

class Card < PageObject::Elements::TableRow
  def edit_element
    link_element(href: /edit/)
  end
end
PageObject.register_widget :card, Card, :tr

Затем объект страницы будет определен для включения виджета:

class AccountPage
  include PageObject
  cards(:card, :css => 'table#cards tr')
end

Затем это позволяет вам написать тест как:

page = AccountPage.new(browser)
page.card_elements.each do |card|
  card.edit_element.visible?.should == true
end

Обратите внимание, что это не сработает в первой строке без ссылки на редактирование. Чтобы улучшить читаемость и убедиться, что все строки проверены, я бы предложил использовать синтаксис expect, который включает метод all:

page = AccountPage.new(browser)
expect(page.card_elements.map(&:edit_element)).to all be_visible
person Justin Ko    schedule 16.04.2015
comment
Спасибо, Джастин. Я попробую виджетный подход. Не использовал их раньше. - person Rahul; 16.04.2015