t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f748bbd3420> #<Tag:0x00007f748bbd3308> #<Tag:0x00007f748bbd3240>

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

Есть есть страница 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?

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

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

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

  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

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

2 Симпатий

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