Подскажите пожалуйста как лучше поступить в ситуации, когда нужно по мимо функционала проверить наличие корректного перевода для определенной локали. К примеру:
Есть есть страница 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?
И как поступить лучше, если в дальнейшем будут добавлять другие локали?
Не вижу смысла тестировать локализацию на уровне браузерных тестов. Это должно быть сделано уровнями ниже.
Если же по каким то причинам все таки вам нужно это делать в браузерных тестах, то:
- Page objects делайте независимыми от конкретной локали (так как у вас в примере)
- Тексты переводов вынести в translations.yaml или еще какой-нить конфиг файл. Как-то так например:
# ...
login_page:
sign_in_button:
en: Sign in
ru: Войти
# ...
- Напишите хелпер для вытягивания перевода по ключу
# 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
- Потом в коде тестов и в самих объектах страниц сможете доставать нужные значения переводов вызовом
tranlate('some_page.some_element')
. При условии появления новых локалей вам нужно будет всего-лишь добавить строки в translations.yml и запускать тесты с переменной окружения LANG=$new_locale_name
Но все-же я бы поговорил сначала с командой на предмет необходимости таких тестов…
2 лайка
Спасибо большое за развернутый ответ. Подниму впорос о необходимости этих тестов на этом уровне. Если будет принято решение, воспользуюсь вашим советом.