Ошибка Nokogiri: неопределенный метод `radiobutton_with '- Почему? - PullRequest
3 голосов
/ 18 марта 2010

Я пытаюсь получить доступ к форме, используя mechanize (Ruby). На моей форме у меня есть группа Радиобутонов. Поэтому я хочу проверить один из них.

Я написал:

target_form = (page/:form).find{ |elem| elem['id'] == 'formid'}
target_form.radiobutton_with(:name => "radiobuttonname")[2].check

В этой строке я хочу проверить радиокнопку со значением 2. Но в этой строке я получаю сообщение об ошибке:

: undefined method `radiobutton_with' for #<Nokogiri::XML::Element:0x9b86ea> (NoMethodError)

1 Ответ

6 голосов
/ 14 мая 2011

Проблема возникла из-за того, что использование страницы Mechanize как документа Nokogiri (путем вызова метода /, или search, или xpath и т. Д.) Возвращает элементы Nokogiri, а не элементы Mechanize с их специальными методами. 1004 *

Как отмечено в комментариях, вы можете быть уверены, что получите Mechanize::Form, используя метод form_with, чтобы найти вашу форму.

Иногда, однако, вы можете найти нужный вам элемент с помощью Нокогири, но не с помощью Механизации. Например, рассмотрим страницу с элементом <select>, который не находится внутри <form>. Поскольку формы нет, вы не можете использовать метод Mechanize field_with, чтобы найти выбор и получить экземпляр Mechanize::Form::SelectList.

Если у вас есть элемент Nokogiri и вы хотите получить эквивалент Mechanize, вы можете создать его, передав элемент Nokogiri конструктору. Например:

sel = Mechanize::Form::SelectList.new( page.at_xpath('//select[@name="city"]') )

В вашем случае, когда у вас было Nokogiri::XML::Element и вы хотели Mechanize::Form:

# Find the xml element
target_form = (page/:form).find{ |elem| elem['id'] == 'formid'}
target_form = Mechanize::Form.new( target_form )

P.S. Первая строка выше более просто достигается с помощью target_form = page.at_css('#formid').

...