У меня есть приложение Rails 6, которое я тестирую с помощью rspe c, Capybara и Chrome на удаленной виртуальной машине. С новой драгоценностью вебдрайверов, а не той древней полтергейстской штукой.
В ней есть мини-приложение менеджера пользователей, написанное на Vue 2. что-то, что ведет себя в некоторой степени ошеломляюще:
Выдержка из Vue приложения
{
el: "#app",
data: {
initial_load_completed: false,
users: []
},
created: function(){
this.loadUsers();
},
methods: {
loadUsers: function(){ /* straightforward JSON load from server into .users and set .initial_load_completed to true */ }
/* lots of other code */
},
computed: {
hasUsers: function(){
return this.users.length > 0;
}
/* lots of other code */
}
}
Просмотр выдержки
<div id="app">
<!-- loads of other code -->
<div v-if="!initial_load_completed && !hasUsers">Loading your users, please wait...</div>
<div v-if="initial_load_completed && !hasUsers">There are no users for your account right now...</div>
<!-- lots of other code -->
</div>
Приложение отлично работает в prod и dev, на chrome, safari , планшеты, iphones, даже на моем 3-летнем Smart TV Trashroid, даже на IE. Но в тестах rspe c он выполняет следующие действия:
Этот пример с отображением / скрытием этих двух элементов div, основанных на загруженных пользователях, просто что на этой картинке неправильно, многие другие элементы управления не должны отображаться с пустым массивом пользователей. И это счастливый, счастливый, радостный случай, около 50% примеров запускает, он просто ничего не выводит, #app пусто ... случайно.
В моем test.log я вижу, как Приложение Vue достигает конечной точки JSON моего бэк-энда и того, как оно отображает данные с помощью 200.
Для жизни я не могу представить, как initial_load_completed
может быть истинным и ложным в в то же время.
Что я пробовал? Перезагрузил машину (хе). Затем переустановил все программное обеспечение до последних версий. Затем потратил около 2 дней, пытаясь заставить chrome работать на «виртуальном» дисплее, к которому я бы подключился, чтобы посмотреть, что происходит ... после примерно 218 итераций, исправляющих различные ошибки / конфигурации и конфигурации, а также код и знаки и другие ошибки и так далее, я просто сдался.
Определение драйвера:
Webdrivers.logger.level = :DEBUG
default_chrome_args = [ '--disable-extensions', '--no-sandbox', '--disable-dev-shm-usage', '--remote-debugging-port=9222', '--remote-debugging-address=0.0.0.0' ]
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( loggingPrefs: { browser: 'ALL' }, chromeOptions: {
'args' => default_chrome_args + ['--headless', '--disable-gpu', '--window-size=1920,1600' ]
})
Capybara::Selenium::Driver.new app, browser: :chrome, desired_capabilities: capabilities
end
CSP отключены, все равно пробовали с ними и без них.
Вчера Я попытался записать JS ошибок:
config.after(:each, type: [ :feature, :system ], js: true) do
errors = page.driver.browser.manage.logs.get(:browser)
if errors.present?
aggregate_failures 'javascript errrors' do
errors.each do |error|
expect(error.level).not_to eq('SEVERE'), error.message
next unless error.level == 'WARNING'
STDERR.puts 'WARN: javascript warning'
STDERR.puts error.message
end
end
end
end
... не повезло.
config.after(:each, type: [ :feature, :system ], js: true) do
errors = page.driver.browser.manage.logs.get(:browser)
errors.each do |error|
STDERR.puts error.message
end
end
... также нада, как и несколько других вариантов этого кода. Кажется, я даже не могу привести примеры «помещает: что угодно» в stdout, но это уже другая история.
Может ли кто-то добрый в душе, пожалуйста, помогите бедному глупому мне не потерять все волосы?