Подтвердить что ты не робот

Убедитесь, что элемент отсутствует у 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, поэтому мне может не хватать чего-то очевидного.

4b9b3361

Ответ 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