Проверка наличия элемента без потери времени в Capybara

Мне нравится держать вещи сухими, поэтому я хочу, чтобы на одном из моих шагов было следующее:

if first(:css, "#blabla") != nil
    find_by_id(blabla).click
end
find_by_id(....)
....

Это означает, что он будет искать определенный элемент, и если он существует, он нажмет на него. Если нет, я не буду терять время (мое время ожидания по умолчанию - 20 секунд, которое будет использоваться, если я поставлю find вместо first там.

Основная проблема заключается в том, что я не хочу терять время при проверке определенного элемента в этом случае, но мне также интересно, хороший ли это подход.

Ответ 1

Я вижу, что ваш код делает ненужный второй запрос в браузере (у вас уже есть first(:css, "#blabla"), поэтому не нужно делать find_by_id(blabla))

Я предлагаю вам найти элемент, используя один запрос:

el = first('#blabla')
el.click unless el.nil?

Обратите внимание, что здесь нет потерянного времени, поскольку first не блокируется.

Однако first не проверяет, нет ли других элементов на странице. Вы можете добавить :maximum, чтобы проверить его:

el = first('#blabla', maximum: 1)
el.click unless el.nil?

Ответ 2

Когда вы используете #find для определения наличия элемента, вы должны сократить время ожидания только для этого вызова:

if page.has_css?('#blabla', wait: 0)
  # Do something
end

Тем не менее, в вашем особом случае предлагаемое решение даже лучше, поскольку оно экономит вам несколько вызовов "найти" для одного и того же элемента.