Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Проверка переводов PageObject SitePrism Rspec

rspec
page-object
ruby
Теги: #<Tag:0x00007fedbba2e4b8> #<Tag:0x00007fedbba2e238> #<Tag:0x00007fedbba2e080>

(Святослав Ос) #1

Подскажите пожалуйста как лучше поступить в ситуации, когда нужно по мимо функционала проверить наличие корректного перевода для определенной локали. К примеру:

Есть есть страница login_page.rb:

module PageObjects

  class LoginPage < SitePrism::Page

    set_url '/login'

    element :enter_btn, 'input[name="commit"]'

    def enter
      enter_btn.click
    end

  end
end

Есть тест Rspec:

require 'spec_helper'

describe 'blablabla' do
  let(:login_page) { PageObjects::LoginPage.new }

  context 'bla bla bla' do

   it 'bla bla bla' do
     login_page.load
     login_page
       .enter
   end
 end
end

Есть спецификации с ожидаемым текстом переводов, как лучше поступить:
1.Захаркдодить в Xpath на странице login_page.rb, как объект:

  • element :en_enter_btn, ‘//input[contains(.,‘Sign in’)]’
  • element :ru_enter_btn, ‘//input[contains(.,‘Войти’)]’

2.Элементу задать гибкий селектор на странице login_page.rb, а проводить проеврку непосредственно в тесте:
login_page.rb
element :enter_btn, ‘input[name=“commit”]’

rspec.rb
expect(login_page).to have_text (войти или sign in)
или
expect(login_page).to have_xpath(//input[contains(.,‘Sign in’)] или еще что то)

3.Возможно вынести локаторы в отдельный файл, в который нужно будет ходить и доставать или перевод или xpath?

И как поступить лучше, если в дальнейшем будут добавлять другие локали?


(Vitalii Grygoruk) #2

Не вижу смысла тестировать локализацию на уровне браузерных тестов. Это должно быть сделано уровнями ниже.

Если же по каким то причинам все таки вам нужно это делать в браузерных тестах, то:

  1. Page objects делайте независимыми от конкретной локали (так как у вас в примере)
  2. Тексты переводов вынести в translations.yaml или еще какой-нить конфиг файл. Как-то так например:
# ...
login_page:
  sign_in_button: 
    en: Sign in
    ru: Войти
# ...
  1. Напишите хелпер для вытягивания перевода по ключу
# Usage example: translate('login_page.signin_button')
# @returns String translation for @param path for locale set via ENV['LANG']
def translate(path)
  locale = ENV.fetch('LANG', 'en')  # default to "en"
  traverse_yaml(path.split('.'), config[locale])
rescue => _
  raise "No translation found for: #{path}.#{locale}"
end

def config
  @config ||= YAML.safe_load(File.open(File.expand_path('./translations.yml', File.dirname(__FILE__))))
end

def traverse_yaml(path_array, tree)
  if path_array.empty?
    tree
  else
    key = path_array.shift
    traverse_yaml(path_array, tree[key])
  end
end
  1. Потом в коде тестов и в самих объектах страниц сможете доставать нужные значения переводов вызовом tranlate('some_page.some_element'). При условии появления новых локалей вам нужно будет всего-лишь добавить строки в translations.yml и запускать тесты с переменной окружения LANG=$new_locale_name

Но все-же я бы поговорил сначала с командой на предмет необходимости таких тестов…


(Святослав Ос) #3

Спасибо большое за развернутый ответ. Подниму впорос о необходимости этих тестов на этом уровне. Если будет принято решение, воспользуюсь вашим советом.