Существует множество правил безопасности для доступа к содержимому буфера обмена, поэтому попытка заставить пасту работать с 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')