Вопрос:

Могу ли я определить, является ли элемент (кнопка) «кликабельным» в моих rspecs?

ruby rspec click capybara

457 просмотра

2 ответа

317 Репутация автора

Контекст : в моем rspec (с использованием Ruby и Capybara)

  1. Я нажимаю на ссылку, чтобы проверить действие в моем приложении: добавление ветви в мое приложение.
  2. Откроется модальное окно , в котором я выбираю ветку, а затем нажимаю кнопку «Отправить», чтобы добавить ветку в мое приложение. После нажатия «отправить» модальное окно закрывается.
  3. Rspecs продолжается, нажав «Сохранить» на главном экране, чтобы сохранить состояние приложения (и эффективно сохранить добавление ветки).

Проблема : rspec терпит неудачу, потому что (по-видимому) пытается нажать кнопку «Сохранить» на главном экране, пока модальное окно, которое используется для выбора ветви, все еще присутствует. Тест не жалуется, что не может найти компонент кнопки «Сохранить», но что на него нельзя нажать.

Ошибка в журнале:

[...]Save</button> is not clickable at point (692, 23). Other element would receive the click[...]

Гоча : это RSpec правильно проходит на некоторых средах, например , когда он запускается на мой локальный сервер, но он терпит неудачу , когда она выполняется на нашем сервере автоматизации. Таким образом, этот тест был помечен как «хлопьевидный».

Потенциальные решения : вещи, которые мы пробовали до сих пор:

  • Проиграйте нашу «конфигурацию кликов», убедившись, что мы находимся в «состоянии готовности» и что модальное окно исчезло. Мы потерпели неудачу с этим, так как мы продолжали нажимать одну и ту же ошибку.

  • Реализуйте «ждать». Мы добавили цикл, чтобы немного поспать, пока модальное окно, казалось, существовало

    XYZ.add_new_branch_name(@branch_name) while Utilities.element_visible?(:xpath, myElement) sleep(0.5) end XYZ.save

Условие while проверяет, существует ли кнопка «Отправить» модального окна. Функция element_visible использует

find(method,element).visible?

но я не уверен, что find уже должна учитывать, что кнопка может существовать и быть видимой, но не активной .

Поскольку это по-прежнему не удается, несмотря на все наши усилия, чтобы убедиться, что модальный режим исчез, прежде чем мы попытаемся нажать на кнопку «Сохранить», я хочу, чтобы спросить:

Есть ли правильный способ определить, является ли элемент позади модального окна кликабельным или не использует rspecs?

Автор: Diego Источник Размещён: 29.12.2017 06:54

Ответы (2)


2 плюса

33864 Репутация автора

Решение

findзаботится только о «видимости», а не о «кликабельности» (и разные драйверы могут иметь немного разные интерпретации «видимости»). Причиной этой нестабильности, скорее всего, является скорость машины, на которой выполняются тесты, что влияет на время анимации модальной анимации. Лучший способ решить эту проблему - отключить анимацию в тестовом режиме (то, как вы это сделаете, зависит от того, какую именно библиотеку и / или CSS вы используете для анимации). Другой способ - сделать то, что вы делаете, - перед тем, как нажать кнопку «Сохранить», убедитесь, что модальный режим исчез, однако вы должны просто использовать предоставляемые Capybara методы (которые включают в себя поведение ожидания / повторной попытки), а не писать собственный цикл. для этого.

 expect(page).not_to have_css('css selector of the modal') # RSpec version
 assert_no_css('css selector of the modal') # minitest version

Изучив позицию мыши по вашей ошибке, вы можете столкнуться с еще одной потенциальной проблемой, связанной с размером экрана и прокруткой. Если для перехода к кнопке «Сохранить» требуется прокрутить страницу и (692, 23) поместить кнопку за фиксированным заголовком (это можно проверить, сделав снимок экрана до попытки нажатия кнопки), тогда она может не возможно для любого драйвера, который вы используете, чтобы нажать кнопку. В этом случае вам нужно использовать execute_scriptдля прокрутки страницы в другое место, чтобы кнопка не закрывалась на странице и / или увеличить размер «браузера», чтобы в тесте прокрутка не требовалась.

Автор: Thomas Walpole Размещён: 29.12.2017 07:54

1 плюс

550 Репутация автора

У меня была похожая проблема, и я решил ее, написав собственную click_on_with_waitвспомогательную функцию:

def click_on_with_wait(text, wait_time: Capybara.default_max_wait_time)
  success = false

  (wait_time * 10).round.times do
    click_on text
    success = true
    break
  rescue Selenium::WebDriver::Error::WebDriverError
    sleep(0.1)
  end

  # Try clicking one last time, so that the error will get raised if it still doesn't work
  click_on text unless success
end

Это попытается нажать на элемент. Если модал все еще скрыт, функция будет ждать 100 мс, а затем повторять попытку, пока не wait_timeбудет достигнута заданная величина.

Используя Rails, я вставил его system_spec_helpers.rbтак, чтобы его можно было просто заменить click_on 'Submit Form'на click_on_with_wait 'Submit Form'.

Автор: Timitry Размещён: 09.05.2019 08:21
Вопросы из категории :
32x32