Эмуляция копирования / вставки в буфер обмена с помощью Selinum + Capybara - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть кнопка «Скопировать ссылку» в моем интерфейсе.При щелчке URL-адрес внутри поля ввода копируется в буфер обмена пользователя с этим JS:

const copyTextarea = document.querySelector("#copy-link-button");
copyTextarea.focus();
copyTextarea.select();
document.execCommand('copy');

Когда я пробую его локально, эта функция работает отлично, поэтому я знаю, что сама функция работает правильно.

Однако я не могу проверить копию с Капибарой.Из этого сообщения я знаю, что Capybara не предоставляет API для буфера обмена, но мой обходной путь - -

  1. Скопируйте ссылку с помощью кнопки «Копировать ссылку»
  2. Перейдите в другое поле ввода / ввода текста
  3. Вставьте в поле CTRL + V и прочитайте содержимое поля, чтобы проверить

Мой тест:

# Copy the link
page.find("#copy-link-button").click
wait_for_ajax

# Visit some other page that I know has an input/text field
visit account_settings_path

input = page.find("#user_email")

# Clear the field
fill_in("user[email]", with: "")

# Paste in the contents of the clipboard
input.base.send_keys([:control, "v"])

# Validate
expect(input.value).to eq("some value");

Однако в этот вход ничего не вставляется (input.value и input.text return "").

Это правильный подход?Это проблема с копированием текста в первую очередь, или я сделал ошибку при вставке данных?

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2019

Существует множество правил безопасности для доступа к содержимому буфера обмена, поэтому попытка заставить пасту работать с Capybara действительно будет разочаровывающим упражнением.Кроме того, большинство браузеров на самом деле ничего не делают, когда ctrl / command v отправляется как нажатие клавиши, так как это запускаемое системой действие, а не браузер.

Однако, поскольку вы просто хотите проверить, работает ли копия, вам фактически не нужно запускать вставку, вам просто нужно обойти требования к разрешениям для использования API буфера обмена.Если вы используете Chrome (в конфигурации без головы - в настоящее время не работает без головы), вы можете сделать это, установив предпочтение profile.content_settings.exceptions.clipboard в своей регистрации драйвера

Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_preference('profile.content_settings.exceptions.clipboard', {
    '*': {'setting': 1}
  })
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Если вы работаете вБезголовый режим и использование современных Capybara и Selen с Chrome. Другой вариант - использовать CDP для предоставления разрешений

page.driver.browser.execute_cdp('Browser.grantPermissions', origin: page.server_url, permissions: ['clipboardRead', 'clipboardWrite'])

После того, как вы разработали разрешения, вы можете использовать evaluate_async_script для доступа кданные буфера обмена

clip_text = page.evaluate_async_script('navigator.clipboard.readText().then(arguments[0])')

Примечания: 1. нет необходимости использовать base для вызова send_keys для элемента, просто вызовите его для элемента 2. expect(input.value).to eq("some value") приведет к ошибочным тестам,вместо этого вы должны использовать предоставленные Capybara соответствия, такие как expect(page).to have_field(with: 'some value') или expect(input).to match_selector(:field, with: 'some value')

...