Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не определяется метод в Cucumber .rb файле


(Ruslan) #1

Всем привет. Столкнулся с проблемой и возникло желание поскорее поделиться ею с вами и найти решение. Собственно запускаю тест на Cucumber, который содержит следующие строки в .rb файле (упростил для восприятия):

Given(/^Get a number of team$/) do
  number = '/user/276/show'.gsub(/"/, "\'").split('/')
  p number[2]
end

…и получаю ошибку undefined method gsub. Почему метод не определен? Это может быть следствием того что не установлены рельсы?


(Mykhailo Poliarush) #2

хм, странная проблема ведь gsub поставляется в ruby core http://www.ruby-doc.org/core-2.1.5/String.html#method-i-gsub

у меня на версии 1.8.7 сработало, а как версия стоит у Вас? и это точно в этой строке выдает?

Ruby 1.8.7 (2008-05-31 patchlevel 0) [x86-linux]
[GCC 4.2.1 (LLVM, Emscripten 1.5, Emscripted-Ruby)]
number = '/user/276/show'.gsub(/"/, "\'").split('/')
=> ["", "user", "276", "show"]

(Eugene Tkachenko) #3

Там скорее всего должно было написано относительно чего undefined method gsub.
Вангуя и погуглив, может не нравятся одинарные скобки, кстати поглядите Ruby Code-Style guide https://github.com/styleguide/ruby.


(Stan) #4

А если попробовать вернуть строку от ‘/user/276/’.to_s.gsub(…) ?
И какой полный текст ошибки, undefined method `gsub’ for nil:NilClass ?


(Eugene Tkachenko) #5

Ненужно будет никаких .to_s, если взять в двойные кавычки “/user/276/”

Double quotes means “please interpret all characters in this string”

Другое дело если "Add five here" + 5.to_s #=> ""Add five here 5"


(Ruslan) #6

Ребята, благодарю за советы. Я наверное Вас запутал. Скорее всего я не правильно применяю методы.
Подскажите, как правильно сохранить возвращаемую xpath-ом ссылку и вытянуть из нее число?
Вот пример над которым упорно тружусь (в комментах ход моих мыслей)

    Given(/^Get a number of team$/) do
    ...
      link = find(:xpath, "//a[contains( text(),'Text')]") # => возвращает ссылку <a href="/tea/52/info">Text</a>
      number = link.gsub(/"/, "\'").split('/') # => разбиваем ссылку по разделителю, преобразовывая ее в массив
      p number[2] # => вытягиваем требуемое нам число"52"
    end

запуская этот сценарий, получаю ошибку: undefined method "gsub" for #<Capybara::Element tag="a"> (NoMethodError)


(Eugene Tkachenko) #7

Так переменная link принимаете объект. Поглядел доку по (Capybara) и вот так скорее всего будет правильно:

link = find(:xpath, "//a[contains( text(),'Text')]").text

(Ruslan) #8

Женя, спасибо Вы натолкнули меня на правильные мысли) В Вашем случае нам будет возвращен просто текст ‘Text’. Для решения задачи я использовал гем Nokogiri - для парсинга HTML. В результате вот что получилось:

Given(/^Get a number of team$/) do
    ...
  doc = Nokogiri::HTML(html)
  number = doc.xpath("//a[contains( text(),'Text')]").to_html.gsub(/"/, "\'").split('/')
  p number[2]
end

Всем спасибо за помощь!