Убедитесь, что элемент отсутствует у Capybara
Используя Capybara, мне нужно утверждать, что элемент формы отсутствует, например: "Тогда я не должен видеть текстовое поле" Username ". Поскольку find выдает исключение, если элемент не найден, это лучшее, что я придумал. Есть ли лучший способ?
Then /^I should not see the "([^\"]+)" ([^\s]+) field$/ do |name, type|
begin
# Capybara throws an exception if the element is not found
find(:xpath, "//input[@type='#{type}' and @name='#{name}']")
# We get here if we find it, so we want this step to fail
false
rescue Capybara::ElementNotFound
# Return true if there was an element not found exception
true
end
end
Я новичок в Capybara, поэтому мне может не хватать чего-то очевидного.
Ответы
Ответ 1
Вы можете сделать это, используя capybaras has_no_selector? метод в сочетании с магическими матчи rspecs. Затем вы можете использовать его следующим образом:
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
Более подробную информацию о утверждениях, которые вы можете выполнить на странице документации capybara здесь в разделе "Запрос"
Ответ 2
Фактически вы можете использовать уже существующие методы, определенные с помощью Capybara.
assert has_no_field?('Username')
Кроме того, есть дополнительные методы, которые могут помочь вам найти различные типы элементов на вашей странице.
has_link? , has_no_link?
has_button?, has_no_button?
has_field?, has_no_field?
has_checked_field?, has_no_checked_field?
has_select?, has_no_select?
И еще много.,
Ответ 3
Вот что я использую:
expect(page).to have_no_css('.test')
Ответ 4
Я попробовал решение, предложенное Derek, однако я столкнулся с некоторыми ложными отрицаниями.
Это
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
проходит, даже если он по какой-то причине не работает.
Я нашел успех с синтаксисом RSpec raise_error
expect { find(:xpath, "//input[@type='#{type}' and @name='#{name}']") }.to raise_error
Я думаю, что это ближе к тому, что вы просите в любом случае. Поэтому я поставил это как ответ.
Ответ 5
Лучший способ сделать это - найти элемент и утверждать, что его нет. Это не только создает многоразовый код, но и весь тест не взорвется, если он не сможет его найти.
Это то, что я делаю...
определить свой объект
def username
page.find('.username')
end
Затем взаимодействуйте с объектом в вашем файле спецификации
username.should be_true
Вам действительно не важно, находится ли элемент на странице (большую часть времени). Что вы заботитесь о том, когда вы пишете тесты, является ли вы взаимодействовать с этим элементом... почему я сначала определяю объект, а затем использую "имя пользователя", чтобы взаимодействовать с ним... посмотрите, сколько кода многократного использования вы можете генерировать? Теперь вы можете щелкнуть, навести, подтвердить, что элемент присутствует, заполнить текст элементом и т.д.
Кроме того, вам обязательно нужно использовать css по xpath, когда это возможно. xpath легче сломать и усложнить чтение.
Ответ 6
У меня была та же проблема. Но поскольку я использую Capybara с Minitest, принятое решение не сработало для меня. Я думал, что должен добавить его, если кто-то в той же ситуации, что и я, найдет этот вопрос.
Можно также использовать:
assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')
Ответ 7
В спецификации файла
expect(@app.some_page_name.is_visible?('search_button')) == true
В файле подкачки
element :search_button, :xpath, "//div[@class='dummy']"
В файле base_page
def is_visible?(value)
begin
eval(value).visible?
return true
rescue => e
p e.message
return false
end
end