Убедитесь, что элемент не присутствует с Capybara - PullRequest
31 голосов
/ 06 мая 2011

Используя Capybara, я должен утверждать, что элемент формы отсутствует, например, «Тогда я не должен видеть текстовое поле« Имя пользователя »». Так как 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

Я новичок в Капибаре, поэтому я могу упустить что-то очевидное.

Ответы [ 7 ]

52 голосов
/ 06 мая 2011

Вы можете сделать это, используя capybaras has_no_selector? метод в сочетании с магическими матчами rspecs. Затем вы можете использовать его следующим образом:

 page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")

Более подробную информацию об утверждениях, которые вы можете выполнить, можно найти на странице документации по капибаре здесь в разделе, озаглавленном «Запрос»

24 голосов
/ 21 февраля 2014

На самом деле вы можете использовать уже существующие методы, определенные средствами сопоставления 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?

и многое другое.,,

9 голосов
/ 17 февраля 2016

Вот что я использую:

expect(page).to have_no_css('.test')
3 голосов
/ 04 ноября 2013

Я испробовал решение, предложенное Дереком , однако натолкнулся на некоторые ложные негативы.

То есть

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

Я думаю, что это все равно ближе к тому, что вы спрашиваете.Поэтому я выдвину это в качестве ответа.

1 голос
/ 16 мая 2013

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

Это то, что я делаю ...

определите свой объект

def username
    page.find('.username')
end

Затем взаимодействуйте с объектом в вашем спецификационном файле

username.should be_true

Вам действительно не важно, находится ли элемент на странице (большую часть времени). Когда вы пишете тесты, вас волнует, можете ли вы взаимодействовать с этим элементом ... вот почему я сначала определяю объект, а затем использую «имя пользователя» для взаимодействия с ним ... посмотрите, сколько кода можно использовать повторно вы можете генерировать? Теперь вы можете щелкнуть, навести указатель мыши, подтвердить наличие элемента, ввести текст для элемента и т. Д.

Кроме того, вам, безусловно, следует рассмотреть возможность использования css поверх xpath, когда это возможно. xpath легче ломать и труднее читать.

0 голосов
/ 16 июля 2019

В файле спецификаций

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
0 голосов
/ 10 июля 2013

У меня была такая же проблема.Но так как я использую Capybara с Minitest, то принятое решение не сработало для меня.Я подумал, что должен добавить это, если кто-то в той же ситуации, что и я, найдет этот вопрос.

Также можно использовать:

assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')

...