Объект страницы Cheezy, определите все text_fields внутри страницы

учитывая этот простой объект страницы:

require 'watir-webdriver'
require 'page-object'

class SomePage
  include PageObject

  text_field :first_name, :name => "fname"
  text_field :last_name, :name => "lname" 
  text_field :birth_date, :name => "birthday" 
  button :submit, :type => "submit"
end

browser = Watir::Browser.new

page = SomePage.new(browser)

есть ли способ перебрать все текстовые поля (или любые элементы) для доступа к их «идентификатору» (т.е.: имя пользователя,: пароль или: рождение)?

что-то типа:

page.text_fields.each do |text_field|
  puts text_field.identifier.inspect
end

=> :first_name
=> :last_name
=> :birth_date

Я просто смотрю, смогу ли я повернуть это:

page.first_name = @user.first_name
page.last_name = @user.last_name
etc...

в это:

page.text_fields.each do |text_field|

  attribute = text_field.attribute

  text_field = @user[attribute]

end

Кто-нибудь знает, что я имею в виду?


person cannotcompute    schedule 20.11.2014    source источник


Ответы (3)


Имена (:first_name, :last_name, :birth_date) используются только для создания имен методов, таких как first_name=, last_name= и birth_date=. Имя не сохраняется и не сохраняется для последующего использования.

Тем не менее, вы можете перебирать методы экземпляра страницы, чтобы найти текстовые поля. Следующий метод text_fields будет:

  1. Получите все методы экземпляра класса.
  2. Найдите методы, оканчивающиеся на "_element".
  3. Создайте массив, который включает имена элементов и элемент.

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

class SomePage
  include PageObject
  text_field :first_name, :name => "fname"
  text_field :last_name, :name => "lname" 
  text_field :birth_date, :name => "birthday" 
  button :submit, :type => "submit"

  def text_fields
    self.class.instance_methods(false)
      .grep(/_element$/)
      .map { |m| 
        element = self.send(m)
        [m[/(.+)_element$/, 1].to_sym, element] if element.kind_of?(PageObject::Elements::TextField)
      }.compact
  end
end

Затем вы можете перебирать текстовые поля с доступом к их имени (или атрибуту) и элементу TextField:

page = SomePage.new(browser)
page.text_fields.each do |attribute, text_field|
  text_field.value = @user[attribute]
end
person Justin Ko    schedule 20.11.2014

Уже предоставленные ответы определенно удовлетворят ваши потребности, но я хотел бы добавить один дополнительный параметр, который использует функцию, встроенную в гем page-object.

Это вызов populate_page_with() в page_populator.rb. Он используется вот так.

Начните с хэша с именами элементов (я использую CSV-файл, который загружается в хеш), как определено на вашем объекте страницы, в ключах. Значение хеша содержит значение, которым вы хотите заполнить каждый элемент.

form_data = {first_name: @user.first_name, last_name: @user.last_name, birth_date: @user.birth_date}

@page.populate_page_with form_data

Вот и все. Метод populate_page найдет нужные элементы на странице и заполнит их любым значением, которое вы установили в исходном хэше. Это работает для флажков, переключателей и текста.

Это очень хороший способ сэкономить время, который придумал для нас Чизи!

Спасибо Чизи!

person Jared Darling    schedule 20.11.2014

Я делаю ровно "наоборот":

@user.each do | key, value |
  unless value.empty?
    browser.text_field(label: key).set value
  end
end

Я выполняю работу для данных, которые у меня есть, а не для полей. Это позволяет протестировать заполнение формы только некоторыми полями.

person Fabrice31    schedule 20.11.2014
comment
Почему не unless value.empty? вместо if !value.empty?? - person Johnson; 21.11.2014