Rails / Rspec / Capybara: интерпретация кавычек для строки JavaScript для сценария выполнения - PullRequest
0 голосов
/ 09 ноября 2018

Учитывая, что мне нужно установить выбранный индекс элемента с javascript в capybara по имени входа ...

var element = document.querySelector("select[name='user[user_locations_attributes][0][location_attributes][state]']").selectedIndex = '50';

Как правильно интерпретировать это как строку, чтобы ее можно было выполнить в Capybara с execute_script(function_name_string)? Поскольку я продолжаю получать синтаксические ошибки, не знаю, как вложить "и" цитаты.

1 Ответ

0 голосов
/ 09 ноября 2018

Самое простое решение вашего вопроса - использовать heredoc

page.execute_script <<~JS
  var element = document.querySelector("select[name='user[user_locations_attributes][0][location_attributes][state]']").selectedIndex = '50';
JS

Хотя, если вам нужен элемент для чего-либо еще, вероятно, лучше найти элемент в ruby, а затем просто вызвать execute_script для элемента

el = find("select[name='user[user_locations_attributes][0][location_attributes][state]']")
el.execute_script('this.selectedIndex = 50;')

Как связанный вопрос - есть ли причина, по которой вы делаете это через JS, а не просто нажимаете на правильный вариант?Если вы просто просматриваете страницу, это не проблема, но если вы на самом деле что-то тестируете, это делает ваш тест недействительным, поскольку вы потенциально можете делать то, что пользователь не может

Поскольку вы прокомментировали, что вытестируя, вы действительно не должны делать это через JS, а вместо этого должны использовать select или select_option.select принимает строку параметров (которая у вас должна быть - иначе зачем нужен элемент select на первом месте)

select('the text of option', from: 'user[user_locations_attributes][0][location_attributes][state]')

select_option вызывается непосредственно для элемента option, который можно найти в рядеспособы, такие как

find("select[name='user[user_locations_attributes][0][location_attributes][state]'] option:nth-child(50)").select_option
...