Проверка наличия элемента без потери времени в 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
Тем не менее, в вашем особом случае предлагаемое решение даже лучше, поскольку оно экономит вам несколько вызовов "найти" для одного и того же элемента.